zoukankan      html  css  js  c++  java
  • *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 }
    View Code

     然而,达到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

  • 相关阅读:
    Java速成笔记
    C语言学习笔记
    形式语义05 Semantics
    密码学04 PRG&PRF
    形式语义04 Types
    密码学03 Computational
    形式语义03 Lambda
    密码学02 Perfect
    形式语义01 Intro
    密码学01 Intro
  • 原文地址:https://www.cnblogs.com/tflsnoi/p/8052089.html
Copyright © 2011-2022 走看看