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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章