CCF NOI1080. 統計字元【桶排序思想】
阿新 • • 發佈:2018-12-14
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
題目描述
Johe最近玩起了字元遊戲,規則是這樣的:讀入四行字串,其中的字母都是大寫的,Johe想列印一個柱狀圖顯示每個大寫字母的頻率。你能幫助他嗎?
輸入
輸入檔案共有4行:每行為一串字元,不超過100個字元。
輸出
與樣例的格式保持嚴格一致。
樣例輸入
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG. THIS IS AN EXAMPLE TO TEST FOR YOUR HISTOGRAM PROGRAM. HELLO!
樣例輸出
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
資料範圍限制
提示
1.輸出的相鄰字元間有一個空格。 2.最後一行的26個大寫字母每次必須輸出。 3.大寫字母A所在的第一列前沒有空格。
題記:
用桶排序的思想,很簡單就能模擬出來~~思路如下:
26個字母,26個桶(letter[27]);
初始都為0,根據輸入的字元,是第幾個字母,第幾個桶就加一(A算第一個字母);
找最大的字母數(max),確定行數;
共max行,26列,用兩個for迴圈輸出;
如果字母數大於等於(max-行數),則輸出“*”,否則輸出空格;
注意中間也有空格!(第33行的作用)
最後輸出26個字母。
C++程式如下:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int letter[27] = {0}; int main(){ int len, max=0; string s; //輸入四行字串,並進行桶排序 for(int i=0; i<4; i++){ getline(cin ,s); len = s.size(); for(int j=0; j<len; j++){ if(s[j]>='A' && s[j]<='Z') letter[s[j]-'A'] ++; } } //找最大字母數量,確定行數 for(int i=0; i<26; i++) if(letter[i] > max) max = letter[i]; //輸出 for(int i=0; i<max; i++){ for(int j=0; j<26; j++){ if(letter[j] >= (max-i)) cout << "*" ; else cout << " "; cout << " "; } cout << endl; } cout << "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"; return 0; }