[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的用法
-
基本概念
- 在 C++ 中,
map是一种关联容器,它存储的是键 - 值(key - value)对。就像是一本字典,其中的 “单词” 是键(key),“单词的释义” 是值(value)。map中的元素是按照键进行自动排序的,默认是按照键的升序排列。 - 它的定义在
<map>头文件中,语法格式为map<键的数据类型, 值的数据类型> 变量名;。例如,map<int, string> myMap;定义了一个map,其中键是整数类型,值是字符串类型。
- 在 C++ 中,
-
插入元素
- 使用
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";。但是需要注意的是,当使用下标操作符插入元素时,如果键不存在,会自动创建一个新的键 - 值对。这可能会导致意外的键插入。例如,如果只是想检查键是否存在而不小心使用了[]操作符,就可能会插入一个新的不需要的元素。
- 还可以使用下标操作符
- 使用
-
访问元素
-
使用下标操作符访问
- 可以通过键来访问
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异常,这样可以更好地处理键不存在的情况。
-
-
遍历元素
- 可以使用迭代器来遍历
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中的每一个键 - 值对。
- 删除元素
- 可以使用
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函数删除该元素。
- 查找元素
- 使用
find函数查找map的find函数用于查找指定键的元素。例如,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]);
}
}
浙公网安备 33010602011771号