笨小熊
时间限制:
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
样例输入
-
2 error olympic
样例输出
-
Lucky Word 2 No Answer 0
来源
- NOIP2008 上传者
问题分析:
输入:一行不包含空格的字符串
处理:求字符串中字母出现次数最多的次数、最少的次数,判断差值是否为素数。
输出:按题目要求进行输出。
关键点事建立字符到出现次数的映射关系,自然想到了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 100 using 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++){
一开始怀疑判断素数写错了,然后怀疑输出格式有问题,然后怀疑map和字符数组初始化有问题(一开始用的全局变量)。最后开始怀疑map是不是不能用,简直怀疑人生。刚开始max,min都设为m[0],所以把i=0设为i=1了。后来发现m[0]可能是0,即这个字母没出现过。因此又换了max,min。但忘了把i=1换成i=0.导致浪费了大量的时间。
收获:
1.尽量不要用全局变量。用全局变量再加上循环使用,很容易让上一次循环的值对下一次循环产生影响。反正是值的改变不可控。尽量使用局部的,哪里使用哪里声明。
2.c语言的最大、最小常量为INT_MAX、INT_MIN。封装在#include <limits.h>库里。不加库名有的编译器可能可以,但有的就不行,所以最好加上。
-
第一行数据N(0<N<100)表示测试数据组数。