1. 程式人生 > >CCF NOI1080. 統計字元【桶排序思想】

CCF NOI1080. 統計字元【桶排序思想】

時間限制: 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;
}