题目链接:http://codeforces.com/gym/101848/problem/B
给出一串数字要你最多改动三个数字使这一串数字成为等差数列。因为最多改动三个数字所以可以先求出相邻两项的差值再进行修改,判断是否符合,最多循环四遍即可。
#include<iostream> using namespace std; int main() { int n,a[100005],b[100005]; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; if(n<=4) { for(int i=0;i<n;i++) b[i]=a[0]; } else { for(int i=n-1;i>=0;i--)//正着循环会wa12,反过来就ac了,特别的迷 { int c,cnt=0; if(i!=n-1)c=a[i+1]-a[i]; else c=a[i]-a[i-1]; b[i]=a[i]; for(int j=i-1;j>=0;j--) { if(a[j]==a[i]+(j-i)*c)b[j]=a[j]; else { b[j]=a[i]+(j-i)*c; cnt++; } } if(cnt>3)continue; for(int j=i+1;j<n;j++) { if(a[j]==a[i]+(j-i)*c)b[j]=a[j]; else { b[j]=a[i]+(j-i)*c; cnt++; } if(cnt>3)break; } if(cnt>3)continue; else break; } } for(int i=0;i<n;i++) { if(i!=n-1)cout<<b[i]<<" "; else cout<<b[i]<<endl; } return 0; }