笨小熊
时间限制:
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
解决问题的关键点和难点就是怎么统计单词中字母出现的个数
关键代码:
for(i=0;i<strlen(a);i++)
b[a[i]-'a']++;
代码:
#include <bits/stdc++.h>
using namespace std;
int sushu(int x)
{
int i;
if(x==0||x==1)
return 0;
else
{
for(i=2;i*i<=x;i++)
if(x%i==0)
{
return 0;
break;
}
return 1;
}
}
int main()
{
int n,x,i,t;
char a[100];
cin>>n;
while(n--)
{
int b[26]={0};
scanf("%s",a);
for(i=0;i<strlen(a);i++)
b[a[i]-'a']++;
sort(b,b+26);
for(i=0;i<26;i++)
if(b[i]!=0)
{
t=i;
break;
}
if(sushu(b[25]-b[t]))
cout<<"Lucky Word"<<endl<<b[25]-b[t]<<endl;
else cout<<"No Answer"<<endl<<'0'<<endl;
}
return 0;
}
注意:b[26]要定义成int型,而且要写在for循环里面,每循环一次就初始化为0;
b[26]={0};代表将b[1]到b[25]全部初始化为0;
相似题:
字母统计
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
- 现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果出现次数最多字母有多个那么输出最小的那个。
-
输入
-
第一行输入一个正整数T(0<T<25)
随后T行输入一个字符串s,s长度小于1010。
输出
- 每组数据输出占一行,输出出现次数最多的字符; 样例输入
-
3 abcd bbaa jsdhfjkshdfjksahdfjkhsajkf
样例输出
-
a a j
注意仔细读题,这道题和上面的那道题并不是完全一样的,要求输出的是个数最多的字符,而且如果有个数一样的,输出的则是较小的那个字符。
错误代码(时间超限):
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
cin>>n;
while(n--)
{
char a[1010];
int b[26]={0},c[26]={0};
scanf("%s",a);
for(i=0;i<strlen(a);i++)
{
b[a[i]-'a']++;
c[a[i]-'a']++;
}
sort(b,b+26);
for(i=0;i<26;i++)
{
if(c[i]==b[25])
{
printf("%c\n",i+97);
break;
}
}
}
return 0;
}
用的是和上面一样的方法,只是多定义了一个数组c保存未排序前的数组;时间超限!(可能是此题要求的个数为1010太大,可是下面用的也是差不多,可能是下面节省了sort排序的时间吧,具体也不知道为什么,不过的确感觉下面的简单些)
正确方法:
关键代码:
for(i=0;i<26;i++)
if(b[i]>m)
{
m=b[i];
t=i;
}
全部代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
cin>>n;
while(n--)
{
char a[1010];
int b[26]={0},m=0,t=0;
scanf("%s",a);
for(i=0;i<strlen(a);i++)
b[a[i]-'a']++;
for(i=0;i<26;i++)
if(b[i]>m)
{
m=b[i];
t=i;
}
printf("%c\n",t+97);
}
return 0;
}
就26个元素,直接用for循环比较找出最大值,在比较大小的同时还能记下数组的下标,下一个就算和这个最大值相等也不满足,b[i]>max,的条件了,就可以达到保留最小的达到最大个数的字母的效果,直接下标+97就是我们要的字母;而用sort,排序可以找到最大值,但是下标会丢失。