題目描述
笨小猴的詞彙量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選對的機率非常大!
這種方法的具體描述如下:假設 \(\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]);
}
}