首页 > 其他 > 详细

洛谷 U85684 读单词

时间:2019-08-29 17:22:58      阅读:69      评论:0      收藏:0      [点我收藏+]

洛谷 U85684 读单词

洛谷传送门

题目背景
由于一些特殊心理的影响,SeawaySeaway主动请缨担任了英语课代表,主要负责班级的课前单词领读工作。

题目描述
SeawaySeaway在领读单词的时候有一个癖好:因为SeawaySeaway是一个极迷信的人,他固执地认为,如果一个单词中出现次数最多的字母出现的次数为质数,但出现次数最少的字母出现的次数不为质数,或者出现次数最少的字母出现的次数为质数,但出现次数最多的字母出现的次数不为质数,那么这个词就是个“好词”,一定要读!如果一个单词中出现次数最多和最少的字母出现的次数都为质数,那么这个词就是个“坏词”,一定不能读!如果一个单词中出现次数最多和最少的字母出现的次数都不为质数,那么这个词就是个“中性词”,读不读看SeawaySeaway心情好坏。但是领读要快速,留给SeawaySeaway判断这个词到底是“好词”、“坏词”还是“中性词”的时间太短了,所以他需要你编写一个程序,帮他确定一个词到底应不应该读。

输入格式
输入文件的第一行包含一串长度为NN的字符,表示SeawaySeaway要读的单词。

输出格式
输出文件只有一行。如果这个单词应该读,就输出“Read it!”,如果不应该读就输出“Shut up!”,如果是“中性词”,就输出“Remember her!”。

输入输出样例
输入 #1 复制
seaway
输出 #1 复制
Read it!
输入 #2 复制
love
输出 #2 复制
Remember her!
输入 #3 复制
roselee
输出 #3 复制
Read it!
说明/提示
数据范围:(NN为字符串长度)

1 \le N \le 10^71≤N≤10
7

输入保证单词全部为小写

题解:

这题改编自(笨小猴),考点是字符串模拟,因为英文一共只有26个字母,我们完全可以新建一个数组(只有30那么大)来保存从\(a\)\(z\)的每个字母出现的次数,最后进行排序和判断即可。

有了这个思路,我们就可以进行代码实现,但是难点是,怎么建立一个由字母到数组下标的映射?

原理很简单。我们应该知道,C++中的每一个字符都对应一个ASCII码,如果我们做字符的“运算”,那么实际上就是这个ASCII码在进行运算,最后把算出来的值再映射回字符。也就是说,我们只需要把输入进去的每一个字母进行ASCII码的操作,最后就能把它返回成整数。

怎么操作呢?我们把每个字母减去\(a\)对应的ASCII码,再加一(自己想一想为什么要加一),就可以转换成\(1-26\)的数组下标了。

最后是排序和判断。

这道题排序是一个坑点,一不小心就容易马虎,如果我们直接从大到小排并取头尾元素的话,会出现取出的最小元素是0的情况(当这个最小元素没有出现过的情况下),这个时候就需要我们循环处理,排完序之后先枚举,碰到第一个不为0的数,再记录下来。

最后的判断没什么难点,细心一点就好了。但是在这里我还想多说几句,就是这个判断(素数判断另写函数)可以不用写的很长,我们发现最后写出来的判断函数只会返回两个值:\(0,1\)。那么我们就可以对两次判断返回的值进行逻辑运算(位运算)。如果两次都是1,就直接输出是,如果两次都是0,就直接输出否,否则就都输出中性词。

当然,这是拓展知识,有兴趣的同学可以通过这篇博客学习基础的位运算。

位运算详解

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e7+1;
int minn,maxx;
char s[maxn];
int tot[30];
bool check(int x)
{
    if(x==0 || x==1)
        return 0;
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0)
            return 0;
    return 1;
}
int main()
{
    //freopen("#10.in","r",stdin);
    //freopen("#10.out","w",stdout);
    scanf("%s",s+1);
    int len=strlen(s+1);
    for(int i=1;i<=len;i++)
        tot[s[i]-'a'+1]++;
    sort(tot+1,tot+27);
    for(int i=1;i<=27;i++)
        if(tot[i]!=0)
        {
            minn=tot[i];
            break;
        }
    maxx=tot[26];
    if(check(minn)&check(maxx)==1)
    {
        printf("Shut up!");
        return 0;
    }
    else if(check(minn)|check(maxx)==0)
    {
        printf("Remember her!");
        return 0;
    }
    else
    {
        printf("Read it!");
        return 0;
    }
}

洛谷 U85684 读单词

原文:https://www.cnblogs.com/fusiwei/p/11430841.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!