首页 > 其他 > 详细

codeforces C. Ryouko's Memory Note

时间:2015-03-06 21:55:47      阅读:363      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!