笨小熊

来源:互联网 发布:mysql数据库安装路径 编辑:程序博客网 时间:2024/04/27 13:44

笨小熊

时间限制:2000 ms  |  内存限制:65535 KB
难度:2
描述

笨小熊的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小熊就认为这是个Lucky Word,这样的单词很可能就是正确的答案。

输入
第一行数据N(0<N<100)表示测试数据组数。
每组测试数据输入只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。
输出
每组测试数据输出共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”; 
第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0
样例输入
2errorolympic
样例输出
Lucky Word2No Answer0
来源
NOIP2008
上传者

hzyqazasdf


问题分析:

输入:一行不包含空格的字符串

处理:求字符串中字母出现次数最多的次数、最少的次数,判断差值是否为素数。

输出:按题目要求进行输出。

关键点事建立字符到出现次数的映射关系,自然想到了map。但这里由于是字符到int型的映射,所以也可以利用字符的ASSIC2码值进行映射。

代码:

#include <iostream>#include <stdio.h> #include <string.h>#include <math.h>#include <vector>#include <queue>#include <stack>#include <map>#include <string>#include <algorithm>#include <limits.h>#define MAX 100using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */bool isPrime(int x){bool ans=true;//因为x小于100 ,所以直接暴力求是否为素数 (字符串长度小于100) //int geometric=sqrt(x)+1;if(x < 2){ans = false;return ans;}for(int i=2;i*i<=x;i++){if(x % i == 0){ans=false;break;}}return ans;}int main(int argc, char** argv) {int n;scanf("%d",&n);while(n--){map<char,int> m; //map初始化  26个字母全部初始化 for(int i=0;i<26;i++) {m['a'+i]=0;}//1.输入一行char  input[MAX]; scanf("%s",input);//2.统计每个字母的出现次数 求max和min  方法:map映射 int length=strlen(input);for(int i=0;i<length;i++){m[input[i]]++;}//3.求max-min int max=0,min=110;for(int i=0;i<26;i++){if(m['a'+i] == 0){  //为0说明这个字母没出现  直接跳过 continue;}if(m['a'+i]>max){max=m['a'+i];}if(m['a'+i]<min){min=m['a'+i];}}//cout<<max<<"  "<<min;//4.输出结果 if(isPrime(max-min) == true) {printf("Lucky Word\n%d\n",max-min); }else{printf("No Answer\n0\n");}}return 0;}
代码分析:

这里

int max=0,min=110;for(int i=0;i<26;i++){
刚开始max,min都设为m[0],所以把i=0设为i=1了。后来发现m[0]可能是0,即这个字母没出现过。因此又换了max,min。但忘了把i=1换成i=0.导致浪费了大量的时间。
一开始怀疑判断素数写错了,然后怀疑输出格式有问题,然后怀疑map和字符数组初始化有问题(一开始用的全局变量)。最后开始怀疑map是不是不能用,简直怀疑人生。

收获:

1.尽量不要用全局变量。用全局变量再加上循环使用,很容易让上一次循环的值对下一次循环产生影响。反正是值的改变不可控。尽量使用局部的,哪里使用哪里声明。

2.c语言的最大、最小常量为INT_MAX、INT_MIN。封装在#include <limits.h>库里。不加库名有的编译器可能可以,但有的就不行,所以最好加上。