传送门:点击打开链接
题目大意:给你一组数,可以对任意一个数进行
(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; }