Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression (暴力)

  • 题意:有一个长度为\(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;
    }
    

猜你喜欢

转载自www.cnblogs.com/lr599909928/p/12934725.html