传送门
- 题意:给你一个数组a,你被允许将每个元素加一、减一或者不变,问:把这个数组变成等差数列需要的最少的操作次数,如果无法操作就输入-1.
- 题解:对于等差数列我们只需要确定第一项和公差。这个等差数列就被确定了,所以可以只考虑该数组前两项能组合出来的情况,一共9种。然后再遍历数组验证答案即可,复杂度:O(9*n)
const int N = 2e5 + 10, M = 1e6 + 7;
int a[N], b[N], c[N];
int main()
{
IOS;
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
if (n <= 2)
{
cout << 0 << endl; return 0;
}
int ans = inf;
for (int i = a[1] - 1; i <= a[1] + 1; i++)
{
for (int j = a[2] - 1; j <= a[2] + 1; j++)
{
int cnt = 0, d = j - i, f = 1;
cnt += abs(i - a[1]) + abs(j - a[2]);
for (int k = 3; k <= n; k++)
{
int now = i + (k - 1) * d;
if (k == 3)
{
if (abs(a[k] - j - d) > 1)
{
f = 0; break;
}
else cnt += abs(a[k] - j - d);
}
else
{
if (abs(a[k] - now) > 1)
{
f = 0; break;
}
else cnt += abs(a[k] - now);
}
}
if (f == 0) continue;
else ans = min(ans, cnt);
}
}
if (ans != inf) cout << ans << endl;
else cout << -1 << endl;
return 0;
}