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\n", sum);
46     return 0;
47 }

 

posted @ 2014-05-26 14:07  水门  阅读(250)  评论(0)    收藏  举报