这道题代码略有瑕疵,但是能AC,只能说样例数据太弱了。而且我的做法很乱(因为菜)。
这道题的要求是输入任意一种可能的答案,那么n=3或4或5几乎就是白给了,怎么改都很方便,不必多说了。
而n很大的时候可,出现最多的就是公差。
那么n至少是多少呢?至多有三个错误数字,所以至多有3个错误邻项差吗?因此只需要前八个数确定的7个公差?
我也是这样想的,但是实际上错了,一个错误的数字能造成两个错误邻项差,3个最多能造成6个邻项差。
给定数据 1, 4, 5, 6, 9, 10, 13, 15, 找出差为 3, 1, 1, 3, 1, 3, 2, 按统计的做法得出 3 或 1。事实上,公差是 2。(正确的是1 3 5 7 9 11 13 15)
因此,必须统计前十个邻项差,至少有11个数 ,n至少为11。
n=6到n=10之间的解法我并没有想好,之后有机会会更正,但是能过按统计公差的方法照样样例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n,count=-1,ans,num=0;
long long int a[100005],b[100005],c[100005];
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%lld",&a[i]);
for(int i=0; i<n-1; i++) // 用b存邻项差
b[i]=a[i]-a[i+1];
if(n==4||n==5||n==3) // n较小直接拿第一个邻项差当公差
{
ans=b[0];
}
if(n>5&&n<11) //暴力的遍历统计法
{
for(int i=0; i<n; i++)
{
int temp=0;
for(int j=0; j<n; j++)
temp+=b[i]==b[j];
if(temp>count)
{
count=temp;
ans=b[i];
}
}
}
if(n>10) //暴力的遍历统计法
{
for(int i=0; i<11; i++)
{
int temp=0;
for(int j=0; j<12; j++)
temp+=b[i]==b[j];
if(temp>count)
{
count=temp;
ans=b[i];
}
}
}
memcpy(c,a,sizeof(a)); // 把a拷贝到c
for(int i=0; i<n-1; i++)
{
if(c[i]-c[i+1]!=ans)
{
c[i+1]=c[i]-ans; //从前向后改
num++;
}
if(num==4) //如果改动了4个数说明不行
{
memcpy(c,a,sizeof(a)); //把改过的c重置的和a一样
break;
}
}
if(num==4) //进行从后往前改
{
for(int i=n-1; i>0; i--)
{
if(c[i]-c[i-1]!=-ans)
c[i-1]=c[i]+ans;
}
}
for(int i=0; i<n; i++)
printf("%lld ",c[i]);
return 0;
}
先插个眼,以后有机会传送会来改。