結果
問題 | No.518 ローマ数字の和 |
ユーザー |
![]() |
提出日時 | 2020-01-16 00:59:20 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,742 bytes |
コンパイル時間 | 1,367 ms |
コンパイル使用メモリ | 165,232 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-13 04:04:29 |
合計ジャッジ時間 | 2,218 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 19 |
ソースコード
#include "bits/stdc++.h"using namespace std;#define int long long#define FOR(i, a, b) for(int i=(a);i<(b);i++)#define RFOR(i, a, b) for(int i=(b-1);i>=(a);i--)#define REP(i, n) for(int i=0; i<(n); i++)#define RREP(i, n) for(int i=(n-1); i>=0; i--)#define ALL(a) (a).begin(),(a).end()#define UNIQUE_SORT(l) sort(ALL(l)); l.erase(unique(ALL(l)), l.end());#define CONTAIN(a, b) find(ALL(a), (b)) != (a).end()#define array2(type, x, y) array<array<type, y>, x>#define vector2(type) vector<vector<type> >#define out(...) printf(__VA_ARGS__)int dxy[] = {0, 1, 0, -1, 0};void solve();signed main(){#if DEBUGstd::ifstream in("input.txt");std::cin.rdbuf(in.rdbuf());#endifcin.tie(0);ios::sync_with_stdio(false);solve();return 0;}/*================================*/int N;string r;std::string replaceStringAll(std::string str,const std::string& replace,const std::string& with) {if(!replace.empty()) {std::size_t pos = 0;while ((pos = str.find(replace, pos)) != std::string::npos) {str.replace(pos, replace.length(), with);pos += with.length();}}return str;}int str2int(string r) {r = replaceStringAll(r, "CM", "CCCCCCCCC");r = replaceStringAll(r, "CD", "CCCC");r = replaceStringAll(r, "XC", "XXXXXXXXX");r = replaceStringAll(r, "XL", "XXXX");r = replaceStringAll(r, "IX", "IIIIIIIII");r = replaceStringAll(r, "IV", "IIII");int ret = 0;for (char c:r) {switch (c) {case 'I': ret += 1; break;case 'V': ret += 5; break;case 'X': ret += 10; break;case 'L': ret += 50; break;case 'C': ret += 100; break;case 'D': ret += 500; break;case 'M': ret += 1000; break;}}return ret;}string int2str(int n) {string s;while(n >= 1000) { s += 'M'; n -= 1000; }while(n >= 900) { s += "CM"; n -= 900;}while(n >= 500) { s += 'D'; n -= 500; }while(n >= 400) { s += "CD"; n -= 400;}while(n >= 100) { s += 'C'; n -= 100; }while(n >= 90) { s += "XC"; n -= 90;}while(n >= 50) { s += 'L'; n -= 50; }while(n >= 40) { s += "XL"; n -= 40;}while(n >= 10) { s += 'X'; n -= 10; }while(n >= 9) { s += "IX"; n -= 9;}while(n >= 5) { s += 'V'; n -= 5; }while(n >= 4) { s += "IV"; n -= 4;}while(n >= 1) { s += 'I'; n -= 1; }return s;}void solve() {cin>>N;int ans = 0;REP(i,N) {cin>>r;ans += str2int(r);}if (ans >= 4000) {cout << "ERROR" << endl;} else {cout << int2str(ans) << endl;}}