JavaW的技术专栏 A CSU coder

【洛谷-P1598】解题报告(字符串)

2020-05-12

C++

原始题目

P1598字符串

题目大意

写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过100个字符),然后用柱状图输出每个字符在输入文件中出现的次数

解题思路

统计各字母出现频次以及频次最大值(作为高),然后按层从高低扫描,层≤该字母出现频次的时候输出。

解题代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 5;

#define rep(i, a, n) for (int i = a; i < n; ++i)
#define per(i, a, n) for (int i = n - 1; i >= a; --i)
#define fi first
#define se second
#define pb push_back
#define np next_permutation
#define mp make_pair
#define endl '\n'
int a[maxn];
string s;
int mmax;
int main()
{
    ios::sync_with_stdio(false);
    mmax = -1;
    rep(i, 0, 4)
    {
        getline(cin, s);
        rep(i, 0, s.length())
        {
            if (s[i] >= 'A' && s[i] <= 'Z') {
                a[s[i] - 'A']++;
                if (a[s[i] - 'A'] > mmax)
                    mmax = a[s[i] - 'A'];
            }
        }
    }
    // rep(i, 0, 26) cout << "#" << a[i] << endl;
    per(i, 1, mmax + 1)
    {
        int target = 25;
        per(j, 0, 26)
        {
            if (a[j] >= i) {
                target = j;
                break;
            }
        }
        if (a[0] >= i)
            cout << "*";
        else
            cout << " ";
        rep(j, 1, target + 1)
        {
            if (a[j] >= i)
                cout << " *";
            else
                cout << "  ";
        }
        cout << endl;
    }
    cout << 'A';
    rep(i, 1, 26) cout << " " << char('A' + i);
    cout << endl;
    cin >> mmax;
}

收获与反思

要注意输出的格式


Comments

Content