LuoguP1125 [NOIP2008 提高組] 笨小猴 題解
阿新 • • 發佈:2021-12-23
LuoguP1125 [NOIP2008 提高組] 笨小猴 題解
了。
,其中endline的意義同上,\(maxn-minn\)即指所求的\(maxn~minn\)所得到的數值。
一個很水的模擬題目,主要考察兩方面——一方面是字串的處理,一方面是數學數論這一塊方面(因為本題出現到了質數的知識,不過只涉及了判斷質數方面)。
這裡介紹一下用\(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\)
所以這道題目就做完了。
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; }