华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1671|回复: 7
打印 上一主题 下一主题

P1125 笨小猴

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-5-17 17:40:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1125
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。

输入输出格式
输入格式:
输入文件word.in只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。

输出格式:
输出文件word.out共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;

第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。

输入输出样例
输入样例#1:
error
输出样例#1:
Lucky Word
2
输入样例#2:
olympic
输出样例#2:
No Answer
0
说明
【输入输出样例1解释】

单词error中出现最多的字母r出现了3次,出现次数最少的字母出现了1次,3-1=2,2是质数。

【输入输出样例2解释】

单词olympic中出现最多的字母i出现了2次,出现次数最少的字母出现了1次,2-1=1,1不是质数。

//注:此处原题解释有误,实际上是0,也不是质数。

noip2008提高第一题
回复

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
推荐
 楼主| 发表于 2018-5-25 20:52:10 | 只看该作者
此题也是考察字符和数字的对应,并且统计出现的次数。注意,0次不算的。
定义数组,a,其中a0表示a出现的次数,a1表示b,a25表示z,那么字符a出现的次数对应着a0,有个转换算式,就是ch出现的次数对应着a(ch-'0')。然后把大于1的次数的最小值和最大值都求出来,相减,判断质数就是。

  1. #include<iostream>
  2. using namespace std;
  3. string s,t;
  4. int a[26];
  5. bool isprime(int i)
  6. {
  7.     bool  b;
  8.     if (i<2) return 0;
  9.     else
  10.     {
  11.         int ii=2;
  12.         b=1;
  13.         while (b && ii*ii<=i)
  14.             if (i%ii==0) b=0;
  15.             else ii++;
  16.     }
  17.     return b;
  18. }
  19. int main()
  20. {
  21.     cin>>s;
  22.     for (int i=0; i<=s.size()-1; i++)
  23.         a[(s[i]-'a')]++;
  24.     for (int i=0; i<=s.size()-1; i++)
  25.         cout<<a[i]<<' ';

  26.     int mmax=1,mmin=999;
  27.     for (int i=0; i<=25; i++)
  28.     {
  29.         if (a[i]>mmax) mmax=a[i];
  30.         if (a[i]>0 && a[i]<mmin) mmin=a[i];
  31.     }
  32.     cout<<endl<<mmax<<' '<<mmin;
  33.     int t=mmax-mmin;
  34.     bool b=isprime(t);
  35.     if (b) cout<<"Lucky Word"<<endl<<t;
  36.     else cout<<"No Answer"<<endl<<'0';
  37.     return 0;
  38. }
复制代码

回复 支持 2 反对 0

使用道具 举报

4

主题

21

帖子

89

积分

注册会员

Rank: 2

积分
89
板凳
发表于 2018-5-25 20:14:52 | 只看该作者
  1. #include<iostream>
  2. #include<cstring>
  3. #include<cmath>
  4. using namespace std;
  5. int zhishu(int x)
  6. {
  7.     if(x<=1) return 0;
  8.     for(int i=2;i<=sqrt(x);i++)
  9.     if(x%i==0) return 0;
  10.     return 1;
  11. }
  12. char a[110];
  13. int main()
  14. {
  15.     int max=0,min=110,sum=0;
  16.     cin>>a;
  17.     int l=strlen(a);
  18.     for(int i=0;i<l;i++)
  19.     {
  20.     for(int j=0;j<l;j++)
  21.     {
  22.     if(a[i]==a[j]) sum++;
  23.     }
  24.     if(max<sum) max=sum;
  25.     if(min>sum) min=sum;
  26.     sum=0;
  27.     }
  28.     if(zhishu(max-min)) cout<<"Lucky Word"<<endl<<max-min<<endl;
  29.     else cout<<"No Answer"<<endl<<"0"<<endl;
  30.     return 0;
  31. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
地板
发表于 2018-7-30 00:03:07 | 只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>

  5. int main(){
  6.         int i,b[27]={0},n,max=0,min=101,k=0;
  7.         char a;
  8.         scanf("%c",&a);
  9.     for(;a!='\n'&&a!=EOF;)
  10.     {
  11.             b[a-96]++;
  12.             scanf("%c",&a);
  13.         }
  14.         for(i=1;i<=26;i++)
  15.         {
  16.                 if(b[i]>max)
  17.                 max=b[i];
  18.                 if(b[i]<min&&b[i]!=0)
  19.                 min=b[i];
  20.         }
  21.         k=max-min;
  22.         if(k==1||k==0)
  23.         {
  24.                 printf("No Answer\n0");
  25.                 return 0;
  26.         }
  27.         for(i=2;i<=sqrt(k);i++)
  28.         {
  29.                 if(k%i==0)
  30.                 {
  31.                         printf("No Answer\n0");
  32.                         return 0;
  33.                 }
  34.         }
  35.         printf("Lucky Word\n%d",k);
  36.     return 0;
  37. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

19

帖子

114

积分

注册会员

Rank: 2

积分
114
5#
发表于 2019-3-17 09:58:32 | 只看该作者
#include<iostream>
using namespace std;
string s,t;
int a[26];
bool b,bb;
int main()
{
    cin>>s;
    for (int i=0; i<=s.size()-1; i++)
        a[(s[i]-'a')]++;



    int mmax=1,mmin=999;
    for (int i=0; i<=25; i++)
    {
        if (a[i]>mmax) mmax=a[i];
        if (a[i]>0 && a[i]<mmin) mmin=a[i];
    }

    int t=mmax-mmin;
    b=1;
    if (t<2) b=0;
    else
    {
        int ii=2;
        bb=1;
        while (bb && ii*ii<=t)
            if (t%ii==0) bb=0;
            else ii++;
    }
    b=bb;
    if (b) cout<<"Lucky Word"<<endl<<t;
    else cout<<"No Answer"<<endl<<'0';
    return 0;
}


回复 支持 反对

使用道具 举报

0

主题

5

帖子

188

积分

注册会员

Rank: 2

积分
188
6#
发表于 2019-3-17 10:14:38 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. string s;
  4. int a[26];
  5. int i,ans;
  6. int maxa,mina;
  7. bool zs(int x)
  8. {
  9.     bool b=1;
  10.     int i=2;
  11.     if(x<2) b=0;
  12.     while(i*i<=x && b)
  13.     {
  14.         if(x%i==0) b=0;
  15.     }
  16.     return b;
  17. }
  18. int main()
  19. {
  20.     maxa=-99999;
  21.     mina=1;
  22.     cin>>s;
  23.    int l=s.size();
  24.    for(i=0;i<=25;i++) a[i]=0;
  25.     for(i=0; i<l; ++i)
  26.         a[s[i]-'a']++;
  27.     for(i=0; i<=25; i++)
  28.     {
  29.         if(a[i]>maxa) maxa=a[i];
  30.         if(a[i]<mina && a[i]!=0) mina=a[i];
  31.     }
  32.     ans=maxa-mina;
  33.     if(zs(ans))
  34.     {
  35.         cout<<"Lucky Word"<<endl;
  36.             cout<<ans;
  37.     }
  38.     else
  39.     {
  40.         cout<<"No Answer"<<endl;
  41.         cout<<"0";
  42.     }
  43.     return 0;
  44. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 03:41 , Processed in 0.317125 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表