zoukankan      html  css  js  c++  java
  • Codeforces Round #248 (Div. 2) C. Ryouko's Memory Note (vector 替换)

    题目链接

    题意:给m个数字, 这些数字都不大于 n,  sum的值为相邻两个数字 差的绝对值。求这n个数字里把一个数字 用 其中另一个数字代替以后,

    最小的sum值。

    分析:刚开始以为两个for 最坏情况下 会超时,但是实际不会,因为如果第一个for循环多的话,第二个for循环肯定少。

    替换的时候,用这个数相关联的排序后 中间的一个数替换,是最小的。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <vector>
     6 #include <algorithm>
     7 using namespace std;
     8 #define Min(a,b)((a)>(b)?(b):(a))
     9 const int maxn = 100000 + 10;
    10 int a[maxn];
    11 vector<int>v[maxn];
    12 
    13 int main()
    14 {
    15     int n, m, i, j, _size, tmp;
    16     __int64 sum, sum2, sum3;
    17     scanf("%d%d", &n, &m);
    18     sum = 0;
    19     for(i = 0; i < m; i++)
    20     {
    21         scanf("%d", &a[i]);
    22         if(i != 0 && a[i] != a[i-1])
    23         {
    24             v[a[i]].push_back(a[i-1]);
    25             v[a[i-1]].push_back(a[i]);
    26             sum += abs(a[i] - a[i-1]);
    27         }
    28     }
    29     vector<int>x;
    30     sum3 = sum;
    31     for(i = 1; i <= n; i++)
    32     {
    33         _size = v[i].size();
    34         if(_size == 0)
    35             continue;
    36         x = v[i];
    37         sort(x.begin(), x.end());
    38         tmp = x[_size/2];
    39 
    40         sum2 = sum3;
    41         for(j = 0; j < _size; j++)
    42             sum2 += (abs(tmp-x[j]) - abs(i-x[j]));
    43         sum = Min(sum, sum2);
    44     }
    45     printf("%I64d
    ", sum);
    46     return 0;
    47 }
  • 相关阅读:
    Python程序执行时的不同电脑路径不同问题
    Python写的计算器程序(主要目的在于熟悉下正则表达式)
    占位符
    selenium自动化测试浏览器驱动安装(属于转载文章)
    python的pip升级问题
    索引
    视图
    事务
    引擎
    约束
  • 原文地址:https://www.cnblogs.com/bfshm/p/3752991.html
Copyright © 2011-2022 走看看