1. 程式人生 > 其它 >LuoguP1125 [NOIP2008 提高組] 笨小猴 題解

LuoguP1125 [NOIP2008 提高組] 笨小猴 題解

LuoguP1125 [NOIP2008 提高組] 笨小猴 題解

一個很水的模擬題目,主要考察兩方面——一方面是字串的處理,一方面是數學數論這一塊方面(因為本題出現到了質數的知識,不過只涉及了判斷質數方面)。


這裡介紹一下用\(getchar\)的做法。

用一個while迴圈不停地用getchar()讀入,然後用一個vis陣列(應該直接想到用map,不過不用map倒也可行,留給讀者思考)統計一下次數。

接著就開始遍歷整個vis陣列去記錄題目中所要求的\(maxn\)\(minn\)了。需要注意的是,如果某個小寫字母在單詞裡出現過,那麼它在vis數組裡對映的次數值肯定不為\(0\),不然在記錄最少出現的字母出現的次數的時候會出現問題,很有可能你不判斷一下它是否在這裡出現的話,它就為\(0\)

了。

這樣得出了題目中的\(maxn\)\(minn\)後,就開始判斷素數了。顯然,因為單詞的長度不超過\(100\),所以\(maxn-minn\)肯定不會超過\(100\),直接用試除法完全可以承受得了此題的資料範圍。當然,各位大佬如果想秀一波操作的話也可以用埃氏篩法或者線性篩,不過在這道題目裡就顯得有點殺雞用牛刀的感覺了。筆者這裡的建議是老老實實地寫暴力試除,反正時間可以承受得了就行。

最後判斷,如果\(maxn-minn\)不是素數,直接輸出\(No~Answer~endline~0\)(endline即指換行,只是不曉得用其他什麼更好的詞語才好描述qwq,就是說,在輸出文本里不要輸出endline,但是這是換行的標識,需要在這裡換行),否則輸出\(Lucky~Word~endline~maxn-minn\)

,其中endline的意義同上,\(maxn-minn\)即指所求的\(maxn~minn\)所得到的數值。

所以這道題目就做完了。


AC程式碼僅供參考,抄襲小心棕名。

#include <cstdio>
#include <algorithm>
#include <map>
#include <cmath>
using namespace std;

char c;
map<char, int> vis;
int maxx = 0, minx = 0x3fffffff;

bool judge(int n) {
	if(n <= 1)	return 0;
	for(int i = 2; i <= sqrt(n); ++i)
		if(!(n % i))	return 0;
	return 1;
}
int main() {
	while((c = getchar()) != '\n') vis[c]++;
	for(char ch = 'a'; ch <= 'z'; ++ch)
		if(vis[ch]) {
			maxx = max(maxx, vis[ch]);
			minx = min(minx, vis[ch]);
		}
	if(!judge(maxx - minx))
		printf("No Answer\n0");
	else
		printf("Lucky Word\n%d", maxx - minx);
	return 0;
}