水题模拟赛与最短最水的代码

今天和Upwinder在一起飙水题。

做到HDOJ1999“不可摸数”时,卡了很久。

后来,我把原来的模拟枚举方法修正了一下,居然还过了。看了思路没错,只是有小漏洞造成的WA啊。不过我们没因为卡了这题就卡了整个进程,这个是很值得以后继续坚持的。

附AC代码:

#include <iostream>
#include <cmath>

#define MAXN 1003

using namespace std;

int res[MAXN];

void init()
{
    long i,j,k;
    int sum;
    res[1]=1;
    res[2]=0;
    res[3]=1;
    for(i=4;i<=1000005;i++)//枚举到1000^2
    {
        k=(int)sqrt((double)i);
        sum=1;
        for(j=2;j<=k;j++)
        {
            if(i%j==0)
            {
                sum+=j+i/j;
            }
            if(sum>1000)
            {
                break;
            }
        }
        if(k*k==i)
        {
            sum-=k;
        }
        if(sum>1000)
        {
            continue;
        }
        res[sum]=1;
    }
    return;
}

int main()
{
	//

    int t,cas,n;
    int i,j,k;

    init();
    scanf("%d",&t);
    for(cas=1;cas<=t;cas++)
    {
        scanf("%d",&n);
        if(res[n]==1)
        {
            printf("no\n");
        }
        else
        {
            printf("yes\n");
        }
    }

    return 0;
}

再后来,Upwinder在百度空间处找到一份很灵异的代码。再后来,他发现原来是那位同学代码满是漏洞,结果还歪打正着,AC过去了。

于是,我用二分的方法,提交了N遍,终于知道,这题实际上是,一旦m为200时,以后的情况全是输出“no”,而前面的情况都输出“yes”。根据这一点,我们互相写更短的代码。

后来,Upwinder把代码长度刷到了113b,真是汗……

该代码如下:

main(){int t,k,z;scanf("%d",&t);while(t--){scanf("%d",&k);if(k==200)z=0;if(z)printf("yes\n");else printf("no\n");}}

好玩吧,挺好玩的。

2 comments

  1. upwinder says:

    看着那行代码,突然感觉很奇怪,哈哈

    1. creke says:

      是我这里的模板CSS比较奇怪……

Leave a comment