存下每个数旁边的数字
将 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[N];
__int64 minn(__int64 a,__int64 b)
{return a<b?a:b;}
int main()
{
int n,m,i,j;
__int64 sum=0;
int a[N];
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;
}