[NOIP2008 提高组] 笨小猴——map的应用

题目描述

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设 \(\text{maxn}\) 是单词中出现次数最多的字母的出现次数,\(\text{minn}\) 是单词中出现次数最少的字母的出现次数,如果 \(\text{maxn}-\text{minn}\) 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。

输入格式

一个单词,其中只可能出现小写字母,并且长度小于 \(100\)

输出格式

共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出 Lucky Word,否则输出 No Answer

第二行是一个整数,如果输入单词是 Lucky Word,输出 \(\text{maxn}-\text{minn}\) 的值,否则输出 \(0\)

样例 #1

样例输入 #1

error

样例输出 #1

Lucky Word
2

样例 #2

样例输入 #2

olympic

样例输出 #2

No Answer
0

提示

【输入输出样例 1 解释】

单词 error 中出现最多的字母 \(\texttt r\) 出现了 \(3\) 次,出现次数最少的字母出现了 \(1\) 次,\(3-1=2\)\(2\) 是质数。

【输入输出样例 2 解释】

单词 olympic 中出现最多的字母 \(\texttt i\) 出现了 \(1\) 次,出现次数最少的字母出现了 \(1\) 次,\(1-1=0\)\(0\) 不是质数。

(本处原题面错误已经修正)

noip2008 提高第一题

总结反思

我的作答

#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
if (n<2) return 0;
for (int i=2;i*i<=n;i++) {
if (n%i==0) {
return 0;
}
}
return 1;
}
int main() {
char ch;
int maxn=0,minn=100;
int result;
map<char, int> mymap;
while ((ch=getchar())!='\n') {
mymap[ch]++;
}
for (int ch1='a';ch1<='z';ch1++) {
maxn=max(maxn, mymap[ch1]);
if (mymap[ch1]!=0) {
minn=min(minn, mymap[ch1]);
}
}
result = maxn - minn;
if (isPrime(result)) {
cout << "Lucky Word" << endl;
cout << result << endl;
} else {
cout << "No Answer" << endl;
cout << 0;
}
return 0;
}

总结

(一)map的用法

  1. 基本概念

    • 在 C++ 中,map是一种关联容器,它存储的是键 - 值(key - value)对。就像是一本字典,其中的 “单词” 是键(key),“单词的释义” 是值(value)。map中的元素是按照键进行自动排序的,默认是按照键的升序排列。
    • 它的定义在<map>头文件中,语法格式为map<键的数据类型, 值的数据类型> 变量名;。例如,map<int, string> myMap;定义了一个map,其中键是整数类型,值是字符串类型。
  2. 插入元素

    • 使用insert函数插入
      • 可以使用insert函数向map中插入元素。例如,myMap.insert(make_pair(1, "one"));,这里make_pair函数用于创建一个包含键和值的pair对象,然后将这个pair插入到map中。也可以写成myMap.insert(std::pair<int, string>(1, "one"));
    • 使用下标操作插入(注意事项)
      • 还可以使用下标操作符[]来插入元素。例如,myMap[2] = "two";。但是需要注意的是,当使用下标操作符插入元素时,如果键不存在,会自动创建一个新的键 - 值对。这可能会导致意外的键插入。例如,如果只是想检查键是否存在而不小心使用了[]操作符,就可能会插入一个新的不需要的元素。
  3. 访问元素

    • 使用下标操作符访问

      • 可以通过键来访问map中的值。例如,string value = myMap[1];,这里通过键1来获取对应的字符串值。但是如果键不存在,使用下标操作符会插入一个新的键 - 值对,其中值会被默认初始化(对于基本类型,如int会初始化为 0,对于类类型会调用默认构造函数)。
    • 使用at函数访问

      更安全的方式是使用at函数来访问元素。例如,try{string value = myMap.at(1);}catch(const std::out_of_range& e){// 处理键不存在的情况}。当键不存在时,at函数会抛出一个out_of_range异常,这样可以更好地处理键不存在的情况。

  4. 遍历元素

    • 可以使用迭代器来遍历map中的元素。例如:
for (map<int, string>::iterator it = myMap.begin(); it!= myMap.end(); ++it) {
cout << "键: " << it->first << ",值: " << it->second << endl;
}
  • 这里it->first表示键,it->second表示值。从begin开始,一直到end结束(end指向最后一个元素的下一个位置),通过迭代器逐步访问map中的每一个键 - 值对。
  1. 删除元素
  • 可以使用erase函数来删除map中的元素。例如,myMap.erase(1);会删除键为1的键 - 值对。也可以通过迭代器来删除元素,例如:
map<int, string>::iterator it = myMap.find(1);
if (it!= myMap.end()) {
myMap.erase(it);
}
  • 这里先使用find函数查找键为1的元素,如果找到(find函数返回的迭代器不等于end),就使用erase函数删除该元素。
  1. 查找元素
  • 使用find函数查找
    • mapfind函数用于查找指定键的元素。例如,map<int, string>::iterator it = myMap.find(1);,如果找到键为1的元素,it会指向该元素,否则it会等于myMap.end()
  • 使用count函数查找
    • count函数用于统计指定键出现的次数。在map中,键是唯一的,所以count函数返回的值要么是 0(键不存在),要么是 1(键存在)。例如,int count = myMap.count(1);可以用来检查键1是否存在。

(二)易错点:统计最小出现次数时,先保证字母数量不为零

for (int ch1='a';ch1<='z';ch1++) {
maxn=max(maxn, mymap[ch1]);
if (mymap[ch1]!=0) {
minn=min(minn, mymap[ch1]);
}
}
发布于   xiins  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示