B. 数螃蟹
Time limit per test: 2.0 seconds
Memory limit: 512 megabytes
kblack 在做数螃蟹的实验。按照「螃蟹爷爷的秘诀」一书上介绍的:由于东方神秘力量的影响,螃蟹的个数是一个完美的等差数列,例如:−2,−1,0,1,2,…。是的,kblack 的螃蟹比较神奇,有的时候螃蟹的个数可能会是负的。
kblack 每天都去池塘记录螃蟹的个数。但是 kblack 自己给自己放了最多三天的假(也有可能两天,有可能一天,有可能不放),放假的时候螃蟹个数的记录就是 kblack 口胡的,有的时候会假得有点过分。
现给出 kblack n 天的记录,记录中至多有三个数是错误的。请纠正错误并输出正确的实验记录。
Input
第一行是一个整数 n (3≤n≤105)。
第二行给出 n 个整数:a1,a2,…,an (|ai|≤109)。
Output
输出正确的实验记录:n 个整数 b1,b2,…,bn。输出应是一个等差数列,与输入的数列至多有三个数不同,且保证 |bi|≤1018。
题目保证有解。如果有多解输出任意一解。
Examples
Input
5 1 2 4 4 5
Output
1 2 3 4 5
Input
4 1 3 5 7
Output
1 3 5 7
Input
4 2 3 3 3
Output
4 3 2 1
#include<stdio.h>
#include<string.h>
#include<map>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long LL;
const int N=1e5+10;
map<double,int>mapp;//mapp存公差d出现的次数,因为有些值是错误的,会造成d是double型数据,所以要开double
LL a[N],ans,b[N];
int sum,k;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
if(n<5)
for(int i=0;i<n;i++)
printf(i==n-1?"%lld\n":"%lld ",a[0]);
else
{
sum=0;
mapp.clear();//以第一个数为准,遍历找公差d
for(int i=1;i<n;i++)
{
if(++mapp[(double)(a[i]-a[0])/i]>sum)//注意double强制转换
{
ans=(a[i]-a[0])/i;
sum=mapp[(double)(a[i]-a[0])/i];
k=i;
}
}
mapp.clear();//以第二个数为准遍历找公差d,并且mapp要清零
if(++mapp[(double)(a[1]-a[0])]>sum)
{
ans=a[1]-a[0];
sum=mapp[(double)(a[1]-a[0])];
k=1;
}
for(int i=2;i<n;i++)
{
if(++mapp[(double)(a[i]-a[1])/(i-1)]>sum)
{
ans=(a[i]-a[1])/(i-1);
sum=mapp[(double)(a[i]-a[1])/(i-1)];
k=i;
}
}
mapp.clear();//以第三个数为准遍历找公差d
if(++mapp[(double)(a[2]-a[0])/2]>sum)
{
ans=(a[2]-a[0])/2;
sum=mapp[(double)(a[2]-a[0])/2];
k=2;
}
if(++mapp[(double)(a[2]-a[1])]>sum)
{
ans=a[2]-a[1];
sum=mapp[(double)(a[2]-a[1])];
k=2;
}
for(int i=3;i<n;i++)
{
if(++mapp[(double)(a[i]-a[2])/(i-2)]>sum)
{
ans=(a[i]-a[2])/(i-2);
sum=mapp[(double)(a[i]-a[2])/(i-2)];
k=i;
}
}
mapp.clear();//以第四个数为准遍历找公差d
if(++mapp[(double)(a[3]-a[0])/3]>sum)
{
ans=(a[3]-a[0])/3;
sum=mapp[(double)(a[3]-a[0])/3];
k=3;
}
if(++mapp[(double)(a[3]-a[1])/(3-1)]>sum)
{
ans=(a[3]-a[1])/(3-1);
sum=mapp[(double)(a[3]-a[1])/(3-1)];
k=3;
}
if(++mapp[(double)(a[3]-a[2])]>sum)
{
ans=a[3]-a[2];
sum=mapp[(double)(a[3]-a[2])];
k=3;
}
for(int i=4;i<n;i++)
{
if(++mapp[(double)(a[i]-a[3])/(i-3)]>sum)
{
ans=(a[i]-a[3])/(i-3);
sum=mapp[(double)(a[i]-a[3])/(i-3)];
k=i;
}
}
b[k]=a[k];
for(int i=k-1;i>=0;i--)
b[i]=b[i+1]-ans;
for(int i=k+1;i<n;i++)
b[i]=b[i-1]+ans;
for(int i=0;i<n;i++)
printf(i==n-1?"%lld\n":"%lld ",b[i]);
}
}