题目来源:AcWing
时间复杂度不超过nlog(n)
每个元素只能修改一次,且要么 +1, -1, 或者不变。
所以首项可以有三种情况,第二项也有三种情况。分别枚举这九种情况,可确定每种情况的首项和公差,由此可推出后面的每一项。
推出的数据与原数组比较,若差大于1,情况排除,差(绝对值)等于1,说明这项有改变。
最后比较出九种情况改变项的最小值。
//正确答案
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
int n, ans = 0x7fffffff;
cin >> 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 ++)
{
int m = fabs(i) + fabs(j);//修改的项数
int a1 = a[0] + i;//首项
int d = a[1] + j - a1;//公差
for(int k = 2; k < n; k ++)
{
int x = a1 + k*d;//第k项
if(fabs(x - a[k]) <= 1)
m += fabs(x - a[k]);//第k项可能变也可能没变
else //情况排除
{
m = 0x7fffffff;
break;
}
}
ans = min(ans, m);
}
}
if(ans != 0x7fffffff) cout << ans;
else cout << "-1";
return 0;
}