HDU2708 Vertical Histogram

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


原文地址:https://www.cnblogs.com/tigerisland/p/7563938.html