Particle

競技プログラミングについての雑記

Problem 89

できるだけ綺麗に書こうとしましたが、微妙です。

解法

実装する

ソース

#include <iostream>
using namespace std;

int rd(char c){
	if(c=='I')return 1;
	if(c=='X')return 10;
	if(c=='C')return 100;
	if(c=='M')return 1000;
	if(c=='V')return 5;
	if(c=='L')return 50;
	return 500;
}

int toN(const string& s){
	int ans = 0,pos = 0,l = s.size(),a,b;
	while(pos<l){
		switch(a = rd(s[pos])){
		case 1:
		case 10:
		case 100:
			if(pos+1<l){
				b = rd(s[pos+1]);
				if(a*5==b||a*10==b){
					ans += b-a;
					pos++;
					break;
				}
			}
		default:
			ans += a;
		}
		pos++;
	}
	return ans;
}

int d(int& a, int div, int cn){
	int ans = a/div*cn;
	a %= div;
	return ans;
}

int R(int a){
	int ans = 0;
	for(int i = 100; i; i/=10)ans += d(a,i*10,1)+d(a,i*9,2)+d(a,i*5,1)+d(a,i*4,2);
	return ans + a;
}

int main(){
	int ans = 0;
	string s;
	while(cin>>s)ans += s.size() - R(toN(s));
	cout<<ans<<endl;
	return 0;
}