0
点赞
收藏
分享

微信扫一扫

Codeforces Round #481 (Div. 3) D - Almost Arithmetic Progression


​​CodeForces - 978D​​​ ​​D - Almost Arithmetic Progression​​

 题意:给你一个数列,要他变成等差数列。只能改变一个元素+或者-1。问最少改变几个可以让他变成等差数列。如果不行输出-1.

思路:等差数列,只需要前两个元素便能确定整个序列,所以只需要排列前两个,就能知道差。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=1e5+10;
const ll INF=0x3f3f3f3f;
ll b[MAXN];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>b[i];
if(n<=2) {
cout<<0<<endl;
return 0;
}
int dis[3]={0,1,-1};
int ans[9],d[9],num=0;
memset(ans,0,sizeof(ans));
for(int i=0;i<3;i++)
for(int j=0;j<3;j++) {
d[num]=(b[1]+dis[j])-(b[0]+dis[i]);
if(dis[j]!=0) ans[num]+=1;
if(dis[i]!=0) ans[num]+=1;
num+=1;
}
for(int x=0;x<9;x++){
int before = b[1]+dis[x%3];
for(int i=2;i<n;i++){
int tmp = b[i]-before;
if(tmp==d[x]){
before = b[i];
} else {
if(tmp+1==d[x]){
before = b[i]+1;
ans[x]+=1;
}
else if(tmp-1==d[x]){
before = b[i]-1;
ans[x]+=1;
}
else{
ans[x]=INF;
}
}
}
}
int result = INF;
for(int x=0;x<9;x++) result=min(ans[x],result);
if(result==INF) cout<<-1<<endl;
else cout<<result<<endl;
}

 

举报

相关推荐

0 条评论