码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces C. Ryouko's Memory Note

时间:2015-03-06 21:57:34      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

题意:给你m个数,然后你选择一个数替换成别的数,使得技术分享.最小。注意选择的那个数在这m个数与它相同的数都必须替换同样的数。

思路:用vector记录每一个数与它相邻的数,如果相同不必记录,然后遍历替换成与它相邻的多个数的中位数之后的所有数的和取最小就可以。。

技术分享
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <vector>
 5 #include <algorithm>
 6 #include <cmath>
 7 #define maxn 100010
 8 #define ll __int64
 9 using namespace std;
10 const int mod=1000000007;
11 const int inf=1<<30;
12 
13 int n,m;
14 ll a[maxn];
15 int sum[maxn];
16 int p[maxn];
17 vector<int>g[maxn];
18 
19 int main()
20 {
21     cin>>n>>m;
22     ll sum=0,max1=0;
23     for(int i=1; i<=m; i++)
24     {
25         scanf("%I64d",&a[i]);
26         max1=max(max1,a[i]);
27         if(i==1)continue;
28         if(a[i]!=a[i-1])
29         {
30             g[a[i-1]].push_back(a[i]);
31             g[a[i]].push_back(a[i-1]);
32             sum+=abs(a[i]-a[i-1]);
33         }
34     }
35     ll ans=sum;
36     for(int i=1; i<=max1; i++)
37     {
38         ll tem=sum;
39         if(!g[i].size()) continue;
40         sort(g[i].begin(),g[i].end());
41         int xx=g[i][g[i].size()/2];
42         for(int j=0; j<(int)g[i].size(); j++)
43         {
44            tem+=(abs(xx-g[i][j])-abs(i-g[i][j]));
45         }
46         ans=min(ans,tem);
47     }
48     printf("%I64d\n",ans);
49     return 0;
50 }
View Code

 

codeforces C. Ryouko's Memory Note

标签:

原文地址:http://www.cnblogs.com/fanminghui/p/4319215.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!