結果
問題 | No.518 ローマ数字の和 |
ユーザー |
![]() |
提出日時 | 2020-09-24 21:49:52 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 1,748 bytes |
コンパイル時間 | 2,235 ms |
コンパイル使用メモリ | 190,612 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-28 05:25:18 |
合計ジャッジ時間 | 3,232 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 19 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;using ul = unsigned long;using ull = unsigned long long;string encode(string s){vector<string> vs = { "IV","IX","XL","XC","CD","CM" };vector<string> vd = { "IIII","VIIII","XXXX","XXXXL","CCCC","CCCCD" };string ss{ s };for (unsigned i = 0; i < vs.size(); ++i){size_t pos = 0;while ((pos = ss.find(vs[i], pos)) != string::npos){ss.replace(pos, vs[i].length(), vd[i]);pos += vd[i].length();}}return ss;}string decode(string s){vector<string> vs = { "CM","CD","XC","XL","IX","IV" };vector<string> vd = { "CCCCD","CCCC","XXXXL","XXXX","VIIII","IIII" };string ss{ s };for (unsigned i = 0; i < vs.size(); ++i){size_t pos = 0;while ((pos = ss.find(vd[i], pos)) != string::npos){ss.replace(pos, vd[i].length(), vs[i]);pos += vs[i].length();}}return ss;}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<string> r(n);for (auto&& it : r){string s;cin >> s;it = encode(s);}vector<int> v = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };map<char, int> me = { {'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000} };map<int, string> md = { {1,"I"},{4,"IV"},{5,"V"},{9,"IX"},{10,"X"},{40,"XL"},{50,"L"},{90,"XC"},{100,"C"},{400,"CD"},{500,"D"},{900,"CM"},{1000,"M"} };int sum{ 0 };for (const auto& it : r){for (const auto& it2 : it)sum += me[it2];}string res;if (sum > 3999)res = "ERROR";else{for (const auto& it : v){int d = sum / it;if (d){for (int i = 0; i < d; ++i)res += md[it];sum -= it * d;}}res = decode(res);}cout << res << "\n";return 0;}