题目描述
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设 \(\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]);
}
}
标签:map,函数,样例,元素,NOIP2008,单词,笨小猴,myMap
From: https://www.cnblogs.com/xiins/p/18518835