kblack 在做数螃蟹的实验。按照「螃蟹爷爷的秘诀」一书上介绍的:由于东方神秘力量的影响,螃蟹的个数是一个完美的等差数列,例如:−2,−1,0,1,2,…。是的,kblack 的螃蟹比较神奇,有的时候螃蟹的个数可能会是负的。
kblack 每天都去池塘记录螃蟹的个数。但是 kblack 自己给自己放了最多三天的假(也有可能两天,有可能一天,有可能不放),放假的时候螃蟹个数的记录就是 kblack 口胡的,有的时候会假得有点过分。
现给出 kblack n 天的记录,记录中至多有三个数是错误的。请纠正错误并输出正确的实验记录。
输入格式
第一行是一个整数 n (3≤n≤105)。
第二行给出 n 个整数:a1,a2,…,an (|ai|≤109)。
输出格式
输出正确的实验记录:n 个整数 b1,b2,…,bn。输出应是一个等差数列,与输入的数列至多有三个数不同,且保证 |bi|≤1018。
题目保证有解。如果有多解输出任意一解。
```cpp
#include<iostream>
#include<map>
#define ll long long
using namespace std;
const int M = 1e5+1;
ll flag[M];
ll g[M];
map<ll,int>m;
int main() {
int n;
cin>>n;
for(int i = 0; i < n; i++) {
cin>>flag[i];
if(i>0)
m[flag[i]-flag[i-1]]++;
}
int M=0;
int d;
//找公差
for(map<ll,int>::iterator it=m.begin(); it!=m.end(); it++) {
if(it->second>M) {
M=it->second;
d=it->first;
}
}
int count=0;
int i = 0;
while(i<n-1) {
while(flag[i+1]-flag[i]!=d)
i++; //以此点开始向前向后枚举 每次枚举假设当前位置数据正确
count=0;
g[i+1]=flag[i+1];
for(int j = i; j >=0; j--) { //先前枚举使其公差为d 1 2 3 5 6 7 8 9 10
g[j]=flag[j];
if(g[j+1]-g[j]!=d) {
g[j]=g[j+1]-d;
count++;
}
if(count>3)
break;
}
for(int j = i+1; j < n; j++) {//向后枚举使其公差为d
g[j]=flag[j];
if(g[j]-g[j-1]!=d) {
g[j]=g[j-1]+d;
count++;
}
if(count>3)
break;
}
if(count<=3) {
break;
}
i++;
}
for(int i = 0 ; i < n; i++)
cout<<g[i]<<" ";
}