[ロサンゼルス問題解決トラブルバレーP5483] [JLOI2011]の少しを

私たちは、柔軟な使用を行うことができます\(C ++ \)この問題を解決するための構文を。

表示されるコードの構文を説明します。

  1. \(文字列::それ\イテレータが\ ) の定義ということを意味\(文字列\)イテレータの種類\(それ\)、\ (^ * ITは、\)の現在の文字列ことを示します\(それ\)の要素。
  2. \(^最大* \) _ \(要素(TOTの+。1、\ TOT + M + 1))この関数は、の長さを返し\(M \)配列\を(TOT \)の最大の要素。

その後、いくつかの基本的なシミュレートされたがあります。

\(AC \)コード:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>//头文件准备
#define itn int
#define gI gi

using namespace std;

inline int gi()
{
    int f = 1, x = 0; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
    return f * x;
}//快速读入

int n, m, tot[1005]/*每个文件中最大的列数*/, cnt, sum/*最大的行数*/;
string s, ans[1005]/*每一行的答案*/, tr;

int main()
{
    n = gi();
    for (itn i = 1; i <= n; i+=1)
    {
        m = gi(), cin >> s;
        memset(tot, 0, sizeof(tot));//记得清空数组
        ans[0] = ans[0] + s/*加上表头*/, sum = max(sum, m)/*计算最大的行数*/;
        for (int j = 1; j <= m; j+=1)
        {
            cin >> tr;//输入每行的元素
            ans[j] = ans[j] + tr;//先加入答案
            for (string :: iterator it = tr.begin(); it != tr.end(); it+=1)//遍历第j行
            {
                tot[j] = tot[j] + (*it == ',');//计算','分隔符个数
            }
        }
        cnt = *max_element(tot + 1,tot + m + 1);//得出最多的','分隔符数量
        for (int j = 0; j < 1005; j+=1)//枚举行。因为我们不知道最终答案的行数,因此就要枚举到最大的行数
        {
            for (int k = tot[j]; k <= ((i == n) ? (cnt - 1) : (cnt)); k+=1)//为答案增加','分隔符,注意判断i==n的情况,此时就要少加上一个','
            {
                ans[j] = ans[j] + ',';//加上','分隔符
            }
        }
    }
    for (int i = 0; i <= sum; i+=1)
    {
        cout << ans[i] << endl;//输出答案
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/xsl19/p/11260819.html