题目链接:信息学奥赛一本通 1851:【08NOIP提高组】笨小猴
http://ybt.ssoier.cn:8088/problem_show.php?pid=1851
题目内容
【题目描述】
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头痛。经实验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是一个Lucky Word,这样的单词很可能就是正确答案。
【输入】
只有一行,是一个单词,其中只可能出现小写字母,且长度小于100。
【输出】
共两行,第一行是一个字符串,假如输入的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;
第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。
【输入样例】
error
【输出样例】
Lucky Word
2
【提示】
【输入输出样例1解释】
单词error中出现最多的字母r出现了3次,出现次数最少的字母出现1次,3-1=2,2是质数。
【输入输出样例2】
输入:
olymipic
输出:
No Answer
0
【输入输出样例2解释】
单词olymipic中出现最多的字母i出现了2次,出现次数最少的字母出现1次,2-1=1,1不是质数。
以下是题解
——————————————分割线——————————————————————————
AC题解
#include <bits/stdc++.h>
using namespace std;
int main(){
long long ans[26],min=1e9,max=-1e9; //min是求出现最少的字母时使用,max反之
bool flag=0;
for(int i=0;i<26;i++){
ans[i]=0;
}
string a;
cin>>a;
for(int i=0;i<a.length();i++){
if(a[i]-'a'<=26){
ans[a[i]-'a']++;
}else if(a[i]-'A'<=26){
ans[a[i]-'A']++;
}
}
for(int i=0;i<26;i++){
if(ans[i]<=min&&ans[i]!=0){
min=ans[i];
}
}
for(int i=0;i<26;i++){
if(ans[i]>=max&&ans[i]!=0){
max=ans[i];
}
}
if(max-min==1||max-min==0){
cout<<"No Answer"<<endl<<"0";
return 0;
}
for(int i=2;i<sqrt(max-min);i++){
if((max-min)%i==0){
flag=1;
}
}
if(flag==0){
cout<<"Lucky Word"<<endl<<max-min;
}else{
cout<<"No Answer"<<endl<<"0";
return 0;
}
return 0;
}
解题思路
一.任务分解
尝试分解任务要点为:
1.输入一个字符串
2.统计字符串中出现最多的字母的数量和出现最少的字母的数量
3.判断两数的差是否是质数
如果是质数,输出 "Lucky Word" ,然后换行输出两数的差。
如果是合数,输出"No Answer",然后换行输出0。
需要特别注意的是,如果两数差是1或者是0,则不认为这是一个Lucky Word 。
二.实现尝试
我首先尝试编写了如下代码:(以下代码不是满分代码!)
#include <bits/stdc++.h>
using namespace std;
int main(){
long long ans[26],min=1e9,max=-1e9;
for(int i=0;i<26;i++){
ans[i]=0;
}
string a;
cin>>a;
for(int i=0;i<a.length();i++){
if(a[i]-'a'<=26){
ans[a[i]-'a']++;
}else if(a[i]-'A'<=26){
ans[a[i]-'A']++;
}
}
for(int i=0;i<26;i++){
if(ans[i]<=min&&ans[i]!=0){
min=ans[i];
}
}
for(int i=0;i<26;i++){
if(ans[i]>=max&&ans[i]!=0){
max=ans[i];
}
}
for(int i=2;i<=sqrt(max-min);i++){
if((max-min)%i==0){
cout<<"No Answer";
return 0;
}
}
cout<<"Lucky Word"<<endl<<max-min;
return 0;
}
结果发现只过了5个测试点,剩下五个点WA掉了。看了一下,发现有以下几个问题:
1.输出“No Answer”的时候,还需要换行输出0!
2.没有实现如果两数差是1或者是0,则不认为这是一个Lucky Word的操作 。
3.原代码中以下部分:
if((max-min)%i==0){
cout<<"No Answer";
return 0;
}
应该修改为布尔型变量flag判断的形式。
于是修改,大功告成!
附:测试点说明
以下测试点是由作者在信息学奥赛一本通测试平台上进行黑箱测试后得到的结果,可以进行参考
| 测试点序号 | 测试点特征 |
|---|---|
| 1 | 不是Lucky Word,Minn和Maxn的差值不为零 |
| 2 | 不是Lucky Word,Minn和Maxn的差值不为零 |
| 3 | 是Lucky Word,Minn和Maxn的差值不为零 |
| 4 | 是Lucky Word,Minn和Maxn的差值不为零 |
| 5 | 是Lucky Word,Minn和Maxn的差值不为零 |
| 6 | 不是Lucky Word,Minn和Maxn的差值为零 |
| 7 | 不是Lucky Word,Minn和Maxn的差值不为零 |
| 8 | 不是Lucky Word,Minn和Maxn的差值不为零 |
| 9 | 是Lucky Word,Minn和Maxn的差值不为零 |
| 10 | 是Lucky Word,Minn和Maxn的差值不为零 |
本文介绍了如何解决一道信息学奥赛题目,即判断一个单词是否为Lucky Word。Lucky Word是指单词中出现次数最多字母与最少字母的差值为质数的单词。文章详细解析了解题思路,包括输入字符串、统计字母出现次数、判断差值是否为质数等步骤,并给出了解题过程中的错误和修正方法。

3867

被折叠的 条评论
为什么被折叠?



