andyli

题解 P5483 【[JLOI2011]小A的烦恼】
本题可以先通过输入数据计算出一些东西:maxrow 所有文件中最大的行数maxcolumn[1~n] 每个文件中最...
扫描右侧二维码阅读全文
27
2019/07

题解 P5483 【[JLOI2011]小A的烦恼】

本题可以先通过输入数据计算出一些东西:

  • maxrow 所有文件中最大的行数
  • maxcolumn[1~n] 每个文件中最大的列数(列数即逗号数+1)
  • cnt[1~n][1~n] 每个文件中每一行的列数

计算完毕后便在每个文件中的每一行末尾补逗号,并在每个文件中补全是逗号的行,最后逐行逐列输出。
代码如下:

#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 105;
// 所有csv文件,files[i][j]表示第i个文件的第j行
string files[maxn][maxn];
// csv文件名
string filename[maxn];
// row[i]为第i个文件的行数
// maxrow为所有文件中最大的行数(即max(row))
// cnt[i][j]表示第i个文件中第j行的列数(如a1,b1,c1的列数为3),即这一行逗号的总数+1
// maxcolumn[i]即为max(cnt[i])
int row[maxn], maxrow, maxcolumn[maxn], cnt[maxn][maxn];

// 统计字符串str中逗号的个数
int Count(const string& str)
{
    int cnt = 0;
    for (const auto& x : str)
        if (x == ',')
            cnt++;
    return cnt;
}
int main()
{
    // cin,cout优化
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    // 读入数据并计算maxrow, maxcolumn以及cnt
    for (int i = 1; i <= n; i++) {
        cin >> row[i] >> filename[i];
        maxrow = max(maxrow, row[i]);
        for (int j = 1; j <= row[i]; j++)
            cin >> files[i][j],
                maxcolumn[i] =
                    max(maxcolumn[i], cnt[i][j] = Count(files[i][j]) + 1);
    }
    // 每一行列数若不足maxcolumn[i],则补逗号
    for (int i = 1; i < n; i++)
        for (int j = 1; j <= row[i]; j++) {
            int x = maxcolumn[i] - cnt[i][j] + 1;
            while (x--)
                files[i][j].push_back(',');
        }
    // 第n个文件特殊处理
    for (int i = 1; i <= row[n]; i++) {
        int x = maxcolumn[n] - cnt[n][i];
        while (x--)
            files[n][i].push_back(',');
    }
    // 行数若不足maxrow,则补充逗号
    for (int i = 1; i < n; i++)
        for (int j = row[i] + 1; j <= maxrow; j++)
            files[i][j] = string(maxcolumn[i], ','); // string(int x, char ch) 构造函数,返回x个ch的副本(即若x=5,ch='x',构造函数返回"xxxxx")
    // 第n个文件特殊处理
    for (int i = row[n] + 1; i <= maxrow; i++)
        files[n][i] = string(maxcolumn[n] - 1, ',');
    for (int i = 1; i < n; i++)
        filename[i] += string(maxcolumn[i], ',');
     // 第n个文件特殊处理
    filename[n] += string(maxcolumn[n] - 1, ',');
    for (int i = 1; i <= n; i++)
        cout << filename[i];
    cout << endl;
    // 注意输出顺序
    for (int i = 1; i <= maxrow; i++) {
        for (int j = 1; j <= n; j++)
            cout << files[j][i];
        cout << endl;
    }
    return 0;
}
Last modification:November 6th, 2019 at 05:10 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment