传送门:点击打开链接
题目大意:给你一组数,可以对任意一个数进行
(1)+1
(2)-1
两种操作(二选一),问至少要进行几次这样的操作,能使原数列变成一个等差数列。
思路:
对于开头两个数,从共有3*3=9种操作,从开头两项就能确定公差,然后继续对后面的数进行判断和修改。
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 100005;
int n,b[maxn],a[maxn],ans,tot=inf;
bool flag;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
{
flag = 1;
memcpy(b,a,sizeof(a));
b[0] += j;
b[1] += i;
int d = b[1]-b[0];
ans = abs(i)+abs(j);
for(int k=2;k<n;k++)
{
if(abs(b[k]-b[k-1]-d)==1)
{
ans++;
b[k] = b[k-1]+d;
}
else if(abs(b[k]-b[k-1]-d)>1){
flag = 0;
break;
}
}
if(flag)
tot = min(ans,tot);
}
if(tot==inf)
cout<<-1<<endl;
else
cout<<tot<<endl;
return 0;
}