LuoguP1125 [NOIP2008 提高组] 笨小猴 题解

一个很水的模拟题目,主要考察两方面——一方面是字符串的处理,一方面是数学数论这一块方面(因为本题出现到了质数的知识,不过只涉及了判断质数方面)。


这里介绍一下用\(getchar\)的做法。

用一个while循环不停地用getchar()读入,然后用一个vis数组(应该直接想到用map,不过不用map倒也可行,留给读者思考)统计一下次数。

接着就开始遍历整个vis数组去记录题目中所要求的\(maxn\)\(minn\)了。需要注意的是,如果某个小写字母在单词里出现过,那么它在vis数组里映射的次数值肯定不为\(0\),不然在记录最少出现的字母出现的次数的时候会出现问题,很有可能你不判断一下它是否在这里出现的话,它就为\(0\)了。

这样得出了题目中的\(maxn\)\(minn\)后,就开始判断素数了。显然,因为单词的长度不超过\(100\),所以\(maxn-minn\)肯定不会超过\(100\),直接用试除法完全可以承受得了此题的数据范围。当然,各位大佬如果想秀一波操作的话也可以用埃氏筛法或者线性筛,不过在这道题目里就显得有点杀鸡用牛刀的感觉了。笔者这里的建议是老老实实地写暴力试除,反正时间可以承受得了就行。

最后判断,如果\(maxn-minn\)不是素数,直接输出\(No~Answer~endline~0\)(endline即指换行,只是不晓得用其他什么更好的词语才好描述qwq,就是说,在输出文本里不要输出endline,但是这是换行的标识,需要在这里换行),否则输出\(Lucky~Word~endline~maxn-minn\),其中endline的意义同上,\(maxn-minn\)即指所求的\(maxn~minn\)所得到的数值。

所以这道题目就做完了。


AC代码仅供参考,抄袭小心棕名。

#include <cstdio>
#include <algorithm>
#include <map>
#include <cmath>
using namespace std;

char c;
map<char, int> vis;
int maxx = 0, minx = 0x3fffffff;

bool judge(int n) {
	if(n <= 1)	return 0;
	for(int i = 2; i <= sqrt(n); ++i)
		if(!(n % i))	return 0;
	return 1;
}
int main() {
	while((c = getchar()) != '\n') vis[c]++;
	for(char ch = 'a'; ch <= 'z'; ++ch)
		if(vis[ch]) {
			maxx = max(maxx, vis[ch]);
			minx = min(minx, vis[ch]);
		}
	if(!judge(maxx - minx))
		printf("No Answer\n0");
	else
		printf("Lucky Word\n%d", maxx - minx);
	return 0;
}
posted @ 2021-12-23 21:11  Eason_AC  阅读(85)  评论(0)    收藏  举报