题解 P1125 【笨小猴】

· · 题解

这道题是我在洛谷上的第100道橙题,就发片题解纪念一下。

代码行数:26行(对我来说几乎没有压行);时间:3ms(还挺快

不要问我为什么都要期中考试了还发题解

思路

这道题其实根本没有什么坑点和难点,统计一下再算一遍就好了。

不过有一些能让代码更快更简单行数更少的细节:

1.单词长度只有最大只有100,也就是说一个字母出现最多100次(怪怪的),maxn-minn也就只有100,所以把100内所有质数打个表列出来就好了,根本不用什么线性筛。即

const int prime[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};

这里const可以不打,但打上更直观。

2.不用背aASCII码中的编号,直接减去就可以。即

sum[s[i]-'a']++;

这里sum数组表示字母出现了几次,sum[0]表示asum[1]表示b,以此类推。

3.不用定义记录字母有没有在单词中出现过的数组,因为这等价于sum[i]>0

4.输出时只要发现满足直接输出并返回,不用flag

代码

相信没有多少人喜欢看上面的一通分析吧,那么,你们喜欢的代码来了——

#include<cstdio>
#include<cstring>//strlen函数
using namespace std;
char s[110];
const int prime[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};//打表
int sum[26];//记录和
int main(){
    int maxn=0,minn=110;//最大值和最小值,注意初始化
    scanf("%s",s);//用scanf读入字符数组时,注意不用加&
    int len=strlen(s);//求字符串长度的函数
    for(int i=0;i<len;i++){//遍历字符串
        sum[s[i]-'a']++;//见上
    }
    for(int i=0;i<26;i++){//遍历26个字母
        if(sum[i]>maxn) maxn=sum[i];//比较maxn
        if(sum[i]>0&&sum[i]<minn) minn=sum[i];//比较minn,只比较出现过的字母
    }
    for(int i=0;i<25;i++){//遍历25个质数
        if(maxn-minn==prime[i]){//满足条件了
            printf("Lucky Word\n%d",maxn-minn);//输出,注意格式
            return 0;//返回
        }
    }
    printf("No Answer\n0");//不满足的情况,注意输出0
    return 0;//华丽结束
}

在将要期中考试的时候写一篇题解也不容易,别忘了点个赞!