em...这题调了一个小时......思路很简单,对于一个数一共就三种情况,我枚举前两个数,得到首项和公差,然后暴力去看这个组合是否满足等差数列。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
ll n,a[maxn],b[]={0,1,-1};
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
ll ans=1e18,cnt=0,aa;
for(int i=0;i<3;i++){
int a1=a[1]+b[i];
for(int j=0;j<3;j++){
int d=a1-(a[2]+b[j]);
if(!b[j]&&!b[i])cnt=0;
else if(b[j]&&b[i])cnt=2;
else cnt=1;
aa=a[2]+b[j];
int flag=1;
for(int k=3;k<=n;k++){
if(aa-d==a[k]+1||aa-d==a[k]-1){
cnt++;
aa-=d;
}
else if(aa-d==a[k])aa-=d;
else {
flag=0;
break;
}
}
if(flag)ans=min(ans,cnt);
}
}
if(ans==1e18) cout<<-1<<endl;
else cout<<ans<<endl;
}