今天和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");}}
好玩吧,挺好玩的。
看着那行代码,突然感觉很奇怪,哈哈
是我这里的模板CSS比较奇怪……