USACO 2003 February Orange
问题链接:HDU2708 Vertical Histogram。
问题简述:参见上述链接。
问题分析:
这个题与POJ2136应该算是同一题,在HDU中测试数据有所不同:
1.输入的测试数据可能有多组;
2.结果的每一行,最后的空格不输出(坑的地方)。
统计四行输入的大写字母,根据统计结果输出柱状图。
该问题的关键是需要一定的想象力,将统计数据转换成相应的图形。
需要注意的一点是,如果出现次数最多字符的出现次数为max,则输出max行。这是关键的地方。
程序说明:
(略)。
AC的C++语言程序如下:
/* HDU2708 Vertical Histogram */
#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
using namespace std;
const int MAXN = 26;
int acount[MAXN];
int main()
{
int linecount, max;
string s, line;
memset(acount, 0, sizeof(acount));
linecount = 0;
while (getline(cin, s)) {
// 统计字母
for(int i=0; i<(int)s.size(); i++)
// if(isalpha(s[i]))
// acount[s[i] - 'A']++;
if(isupper(s[i]))
acount[s[i] - 'A']++;
// 每4行输出一次结果
if(++linecount == 4) {
linecount = 0;
// 计算最大的统计值
max = 0;
for(int i=0; i<MAXN; i++)
if(acount[i] > max)
max = acount[i];
// 输出max行
for(int i=max; i>0; i--) {
line = "";
for(int j=0; j<MAXN; j++) {
if(acount[j] >= i)
line += "* ";
else
line += " ";
}
int k = line.size() - 1;
while (line[k] == ' ') {
line.erase(k, 1);
k--;
}
cout << line << endl;
}
for(int i=0; i<MAXN-1; i++)
cout << (char)('A' + i) << " ";
cout << 'Z' << endl;
memset(acount, 0, sizeof(acount));
}
}
return 0;
}