-
题意:有一个长度为\(n\)的序列,可以对所有元素++或--,求最少的操作次数,如果无论如何都不能构成,则输出\(-1\).
-
题解:一个等差数列一定由首项\(a_{1}\)和公差\(d\)来决定,而这两项可以有\(a_{1}\)和\(a_{2}\)来决定,所以我们可以直接暴力枚举\(a[1]\)和\(a[2]\),一共\(9\)种情况,每次向后枚举,判断每个位置上的数是否能得到,然后更新最小值即可.
-
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <stack> #include <queue> #include <vector> #include <map> #include <set> #include <unordered_set> #include <unordered_map> #define ll long long #define fi first #define se second #define pb push_back #define me memset const int N = 1e6 + 10; const int mod = 1e9 + 7; const int INF = 0x3f3f3f3f; using namespace std; typedef pair<int,int> PII; typedef pair<long,long> PLL; int n; int d; int a[N],b[N]; int main() { ios::sync_with_stdio(false);cin.tie(0); cin>>n; for(int i=1;i<=n;++i) cin>>a[i]; int ans=INF; for(int i=-1;i<=1;++i){ for(int j=-1;j<=1;++j){ b[1]=a[1]+i; b[2]=a[2]+j; d=b[2]-b[1]; bool ok=1; int cnt=abs(i)+abs(j); for(int k=3;k<=n;++k){ b[k]=b[k-1]+d; if(abs(b[k]-a[k])>1){ ok=0; break; } else if(b[k]!=a[k]) cnt++; } if(ok) ans=min(ans,cnt); } } if(ans==INF) puts("-1"); else printf("%d\n",ans); return 0; }