这道题代码略有瑕疵,但是能AC,只能说样例数据太弱了。而且我的做法很乱(因为菜)。
     EOJ 3561 数螃蟹 瑕疵版
   EOJ 3561 数螃蟹 瑕疵版
     

这道题的要求是输入任意一种可能的答案,那么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;
}
 

先插个眼,以后有机会传送会来改。

相关文章: