您的位置:首页 > 其它

Codeforces 433 C Ryouko's Memory Note

2014-07-07 22:47 218 查看
存下每个数旁边的数字

将 i 旁边的数中从小到大排序取中位数

将 i 替换 中位数

算翻的页数

求出 ans值与mi比较大小

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
const int N = 100000+10;
vector<int>ber
;
__int64 minn(__int64 a,__int64 b)
{return a<b?a:b;}
int main()
{
int n,m,i,j;
__int64 sum=0;
int a
;
scanf("%I64d%I64d",&n,&m);
for(i=0;i<m;i++){
scanf("%I64d",&a[i]);

}
for(i=1;i<m;i++){
sum+=abs(a[i]-a[i-1]);
if(a[i]!=a[i-1])
{
ber[a[i]].push_back(a[i-1]);
ber[a[i-1]].push_back(a[i]);
}
}
__int64 mi=sum;
for(i=1;i<=n;i++)
{
vector<int> x=ber[i];
if(x.size()==0)
continue;
sort(x.begin(),x.end());
int po=x[x.size()/2];
__int64 ans=sum;
for(j=0;j<x.size();j++)
{
ans+=abs(po-x[j])-abs(i-x[j]);
}
mi=minn(mi,ans);
}
printf("%I64d\n",mi);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: