题目链接

https://ac.nowcoder.com/acm/contest/7780/B

解题思路

数学题。
我为什么会这么菜,这都想不出来!
先建立一个满足条件的数组,与给出的数组做差。
将差值保存在map中,并统计相同差值的个数,找到其中次数最多的。
输出总数-最多次数,就是要改的个数。

AC代码

#include<bits/stdc++.h>
#define ll long long
#define sc(x) scanf("%lld",&x)
#define pr(x) printf("%lld",x)
using namespace std;
const int N=1e5;
ll n,x,ans,m[N];
map<ll,ll> cnt;
int main(){
    sc(n);
    for(int i=1;i<=n;i++){
        sc(x);
        m[i]=m[i-1]+i-1;
        ans=max(ans,++cnt[x-m[i]]);
    }
    pr(n-ans);    
}

我好菜!