洛谷 改数

来源:互联网 发布:校园安全事件网络诈骗 编辑:程序博客网 时间:2024/05/21 07:06

题目:给出一个长度为n的整数序列a,你能改动最少的数,使之满足a[i+1]-a[i]=i(1<=i<n)么?

n<=100000 a[i]<1e9


感觉这道题的解法比较巧妙,我们深入发掘这个数列的性质,如果我们随便求一个满足递推式的b数组,假设a数组全部满足递推式,那么有a[i]-b[i]为一个定值,知道了这个性质后,我们可以记录每一个差值出现了几次,那么n-出现次数最多的差值的值即为答案。

#include<cstdio>#include<cstring>#include<algorithm>#include<map>using namespace std;#define maxn 100005map<int,int> f;int a[maxn],b[maxn],n,ans;int main(){scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",a+i);b[1]=1;for (int i=1;i<n;i++) b[i+1]=b[i]+i;for (int i=1;i<=n;i++) {f[a[i]-b[i]]++;ans=max(ans,f[a[i]-b[i]]);}printf("%d\n",n-ans);return 0;}


0 0