[NOIP2008 提高組] 笨小猴——map的應用

xiin發表於2024-10-31

題目描述

笨小猴的詞彙量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選對的機率非常大!

這種方法的具體描述如下:假設 \(\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]);
		}
	}

相關文章