結果

問題 No.518 ローマ数字の和
ユーザー とばりとばり
提出日時 2018-09-09 19:44:33
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 1,629 bytes
コンパイル時間 1,648 ms
コンパイル使用メモリ 181,996 KB
実行使用メモリ 4,384 KB
最終ジャッジ日時 2023-08-25 15:57:36
合計ジャッジ時間 3,010 ms
ジャッジサーバーID
(参考情報)
judge12 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,376 KB
testcase_01 AC 2 ms
4,380 KB
testcase_02 AC 1 ms
4,380 KB
testcase_03 AC 1 ms
4,380 KB
testcase_04 AC 1 ms
4,380 KB
testcase_05 AC 1 ms
4,380 KB
testcase_06 AC 1 ms
4,376 KB
testcase_07 AC 1 ms
4,376 KB
testcase_08 AC 1 ms
4,380 KB
testcase_09 AC 2 ms
4,380 KB
testcase_10 AC 1 ms
4,380 KB
testcase_11 AC 1 ms
4,376 KB
testcase_12 AC 2 ms
4,380 KB
testcase_13 AC 1 ms
4,380 KB
testcase_14 AC 1 ms
4,380 KB
testcase_15 AC 1 ms
4,376 KB
testcase_16 AC 2 ms
4,376 KB
testcase_17 AC 1 ms
4,380 KB
testcase_18 AC 1 ms
4,380 KB
testcase_19 AC 2 ms
4,376 KB
testcase_20 AC 1 ms
4,376 KB
testcase_21 AC 1 ms
4,384 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

using int64 = long long;
using uint64 = unsigned long long;

map<char, int> table{{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50},
                     {'C', 100}, {'D', 500}, {'M', 1000}};
map<int, char> revTable{{1, 'I'}, {5, 'V'}, {10, 'X'}, {50, 'L'},
                        {100, 'C'}, {500, 'D'}, {1000, 'M'}};

int weights[7] = {1000, 500, 100, 50, 10, 5, 1};

int parse(string& roman)
{
    int res = 0,
        prevNum = 1000;
    for (char d : roman)
    {
        int num = table[d];
        res += num;

        if (num > prevNum)
        {
            res -= prevNum * 2;
        }
        prevNum = num;
    }
    return res;
}

string encode(int num, int idx = 0)
{
    if (num >= 4000) return "ERROR";
    if (num == 0) return "";

    string res = encode(num % weights[idx], idx + 1);
    int sameCnt = 1;
    while (sameCnt < res.size() and res[sameCnt] == res[0])
    {
        sameCnt++;
    }

    int cnt = num / weights[idx];
    if (sameCnt >= 4)
    {
        string suf = res.substr(sameCnt);
        if (cnt > 0)
        {
            cnt--;
            suf = revTable[weights[idx - 1]] + suf;
        }
        else
        {
            suf = revTable[weights[idx]] + suf;
        }
        res = res[0] + suf;
    }
    res = string(cnt, revTable[weights[idx]]) + res;

    return res;
}

int main()
{
    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    int N;
    cin >> N;

    int sum = 0;
    for (int i = 0; i < N; i++)
    {
        string R;
        cin >> R;

        sum += parse(R);
    }

    cout << encode(sum) << endl;

    return 0;
}
0