*1407笨小猴(Noip2008提高组第1题)
题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1407
一看题so easy,看题审题到写代码用了25分钟,瞬间出现如下代码,样例轻松过,顺便注释了思路
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 char a[120]; 5 int al,maxn=0,minn=1,m=1; 6 //m记录字母出现的次数 7 bool iss(int x) 8 { 9 if (x==1||x==0)return false;//注意素数判断时这一行是不可缺少的 10 for(int i=2;i*i<=x;i++) 11 if(x%i==0)return false; 12 return true; 13 } 14 int main() 15 { 16 gets(a); 17 al=strlen(a); 18 for(int i=0;i<al-1;i++) 19 { 20 char b=a[i]; 21 for(int j=i+1;j<al;j++) 22 { 23 if(b==a[j])m++; 24 if(m>maxn)maxn=m; 25 if(m<minn)minn=m; 26 } 27 m=1;//恢复m的初始值 28 } 29 30 //cout<<maxn<<minn; 31 //上一行用于测试读取单词中字母数字是否正确,如果正确将其注释掉继续往下写,从而实现模块话 32 if(iss(maxn-minn))cout<<"Lucky Word"<<endl<<maxn-minn; 33 else cout<<"No Answer"<<endl<<"0"; 34 35 return 0; 36 }
然而。。。悲剧悄然发生。。。
what the fuck?..
默默冷静3分钟后发现
原来是第16行调用了gets(),代码中却没有包含头文件#include<cstdio>,wtf?wtf?wtf?
但我用dev编译通过了,然并卵。。是什么问题呢?
因为dev作为ide为了方便用户使用,会默认给代码中增加一些函数,#include<cstdio>被默认添加进去了。。
so 在本地编译时没有问题,但在系统端提交出现编译错误,这是NOIP阶段经常出现的小问题,so,两种方式可以避免:
1.使用linux系统guide
2.平时养成头文件与使用一一对应的好习惯
修改代码后如下(点击加号展开):
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 char a[120]; 6 int al,maxn=0,minn=1,m=1; 7 //m记录字母出现的次数 8 bool iss(int x) 9 { 10 if (x<2)return false;//注意素数判断时这一行是不可缺少的 11 else 12 { 13 for(int i=2;i*i<=x;i++) 14 if(x%i==0)return false; 15 } 16 17 return true; 18 } 19 int main() 20 { 21 gets(a); 22 al=strlen(a); 23 for(int i=0;i<al-1;i++) 24 { 25 char b=a[i]; 26 for(int j=i+1;j<al;j++) 27 { 28 if(b==a[j])m++; 29 if(m>maxn)maxn=m; 30 if(m<minn)minn=m; 31 } 32 m=1;//恢复m的初始值 33 } 34 35 //cout<<maxn<<minn; 36 //上一行用于测试读取单词中字母数字是否正确,如果正确将其注释掉继续往下写,从而实现模块话 37 if(iss(maxn-minn))cout<<"Lucky Word"<<endl<<maxn-minn; 38 else cout<<"No Answer"<<endl<<"0"; 39 40 return 0; 41 }
然而,达到AC过程是艰难曲折的:
再次修改代码如下:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 char a[120]; 6 int al,maxn=0,minn=1,m=0; 7 //m记录字母出现的次数 8 bool iss(int x) 9 { 10 if (x<2)return false;//注意素数判断时这一行是不可缺少的 11 else 12 { 13 for(int i=2;i*i<=x;i++) 14 if(x%i==0)return false; 15 } 16 17 return true; 18 } 19 int main() 20 { 21 gets(a); 22 al=strlen(a); 23 for(int i=0;i<al;i++) 24 { 25 char b=a[i]; 26 for(int j=0;j<al;j++) 27 { 28 if(b==a[j])m++; 29 } 30 if(m>maxn)maxn=m; 31 if(m<minn)minn=m; 32 m=0;//恢复m的初始值 33 } 34 35 // cout<<al<<maxn<<minn; 36 //上一行用于测试读取单词中字母数字是否正确,如果正确将其注释掉继续往下写,从而实现模块话 37 if(iss(maxn-minn))cout<<"Lucky Word"<<endl<<maxn-minn; 38 else cout<<"No Answer"<<endl<<"0"; 39 40 return 0; 41 }
仍然是:
调试中。。。。
调试中。。。。
调试中。。。。
n小时后。。
果断看题解,代码如下:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 char a[120]; 6 int al,maxn=0,minn=1000,m=0; 7 //m记录字母出现的次数 8 bool iss(int x) 9 { 10 if (x<2)return false;//注意素数判断时这一行是不可缺少的 11 else 12 { 13 for(int i=2;i*i<=x;i++) 14 if(x%i==0)return false; 15 } 16 17 return true; 18 } 19 int main() 20 { 21 gets(a); 22 al=strlen(a); 23 int b[30]; 24 memset(b,0,sizeof(b)); 25 //类似于桶排序,把每个字母出现的次数放到新数组里。。很巧妙的写法。。 26 for(int i=0;i<al;i++)b[a[i]-'a']+=1; 27 for(int j=0;j<26;j++) 28 { 29 if(b[j]>maxn)maxn=b[j]; 30 if(b[j]<minn&&b[j]!=0)minn=b[j]; 31 // cout<<b[j]<<" "; 32 } 35 if(iss(maxn-minn))cout<<"Lucky Word"<<endl<<maxn-minn; 36 else cout<<"No Answer"<<endl<<"0"; 37 38 return 0; 39 }
果然AC
然而我的代码错在哪儿呢?找不到问题,就找数据。。。
果真找到NOIP2008那年的数据,通过cena本地测试结果
没错,显示的是100分
so ,ybt在线测试数据可能是根据作者代码造的数据,正好不符合我的代码。。。。
结论:辩证对待OJ上的题,本地AC到了OJ不一定能通过,OJ上AC了NOIP可能会挂掉。。。
OI险恶,谨慎第一,死磕到底,方能AK