描述
一类书的序言是以罗马数字标页码的。传统罗马数字用单个字母表示特定的数值,以下是标准数字表:
I 1 L 50 M 1000
V 5 C 100
X 10 D 500
最多3个同样的可以表示为10n的数字(I,X,C,M)可以连续放在一起,表示它们的和:
III=3
CCC=300
可表示为5x10n的字符(V,L,D)从不连续出现。
除了下一个规则,一般来说,字符以递减的顺序接连出现:
CCLXVIII = 100+100+50+10+5+1+1+1 = 268
有时,一个可表示为10n的数出现在一个比它大1级或2级的数前(I在V或X前面,X在L或C前面,等等)。在这种情况下,数值等于后面的那个数减去前面的那个数:
IV = 4
IX = 9
XL = 40
This compound mark forms a unit and may not be combined to make another compound mark (e.g., IXL is wrong for 39; XXXIX is correct).
像XD, IC, 和XM这样的表达是非法的,因为前面的数比后面的数小太多。对于XD(490的错误表达),可以写成 CDXC; 对于IC(99的错误表达),可以写成XCIX; 对于XM(990的错误表达),可以写成CMXC。 90 is expressed XC and not LXL, since L followed by X connotes that successive marks are X or smaller (probably, anyway).
给定N(1 <= N < 3,500), 序言的页码数,请统计在第1页到第N页中,有几个I出现,几个V出现,等等 (从小到大的顺序)。不要输出并没有出现过的字符。
比如N = 5, 那么页码数为: I, II, III, IV, V. 总共有7个I出现,2个V出现。
输入格式
一个整数N。
输出格式
每行一个字符和一个数字k,表示这个字符出现了k次。字符必须按数字表中的递增顺序输出。
测试样例1
输入
5
输出
I 7
V 2
备注
USACO 2.2.1
代码
------------------------我是妩媚的分割线------------------------
------------------------我是妩媚的分割线------------------------
------------------------我是妩媚的分割线------------------------
------------------------我是妩媚的分割线------------------------
------------------------我是妩媚的分割线------------------------
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 int total[256]; 7 void inc(char xx,int n) 8 { 9 total[int (xx)]+=n; 10 } 11 void add(int xx) 12 { 13 if (xx==1) inc(‘i‘,1); 14 if (xx==2) inc(‘i‘,2); 15 if (xx==3) inc(‘i‘,3); 16 if (xx==4) {inc(‘i‘,1);inc(‘v‘,1);} 17 if (xx==5) inc(‘v‘,1); 18 if (xx==6) {inc(‘v‘,1);inc(‘i‘,1); } 19 if (xx==7) {inc(‘v‘,1);inc(‘i‘,2);} 20 if (xx==8) {inc(‘v‘,1);inc(‘i‘,3);} 21 if (xx==9) {inc(‘i‘,1);inc(‘x‘,1);} 22 if (xx==10) inc(‘x‘,1); 23 if (xx==20) inc(‘x‘,2); 24 if (xx==30) inc(‘x‘,3); 25 if (xx==40) {inc(‘x‘,1);inc(‘l‘,1);} 26 if (xx==50) inc(‘l‘,1); 27 if (xx==60) {inc(‘l‘,1);inc(‘x‘,1);} 28 if (xx==70) {inc(‘l‘,1);inc(‘x‘,2); } 29 if (xx==80) {inc(‘l‘,1);inc(‘x‘,3); } 30 if (xx==90) {inc(‘c‘,1);inc(‘x‘,1); } 31 if (xx==100) inc(‘c‘,1); 32 if (xx==200) inc(‘c‘,2); 33 if (xx==300) inc(‘c‘,3); 34 if (xx==400) {inc(‘c‘,1);inc(‘d‘,1); } 35 if (xx==500) inc(‘d‘,1); 36 if (xx==600) {inc(‘d‘,1);inc(‘c‘,1);} 37 if (xx==700) {inc(‘d‘,1);inc(‘c‘,2); } 38 if (xx==800) {inc(‘d‘,1);inc(‘c‘,3); } 39 if (xx==900) {inc(‘c‘,1);inc(‘m‘,1); } 40 if (xx==1000) inc(‘m‘,1); 41 if (xx==2000) inc(‘m‘,2); 42 if (xx==3000) inc(‘m‘,3); 43 } 44 int main() 45 { 46 int n,t; 47 cin>>n; 48 memset(total,0,sizeof(total)); 49 for(int j=1;j<=n;j++) 50 { 51 int i=j; 52 if(i>=3000) {add(3000);i-=3000;} 53 if(i>=2000) {add(2000);i-=2000;} 54 if(i>=1000) {add(1000);i-=1000;} 55 if(i>=900) {add(900);i-=900;} 56 if(i>=800) {add(800);i-=800;} 57 if(i>=700) {add(700);i-=700;} 58 if(i>=600) {add(600);i-=600;} 59 if(i>=500) {add(500);i-=500;} 60 if(i>=400) {add(400);i-=400;} 61 if(i>=300) {add(300);i-=300;} 62 if(i>=200) {add(200);i-=200;} 63 if(i>=100) {add(100);i-=100;} 64 if(i>=90) {add(90);i-=90;} 65 if(i>=80) {add(80);i-=80;} 66 if(i>=70) {add(70);i-=70;} 67 if(i>=60) {add(60);i-=60;} 68 if(i>=50) {add(50);i-=50;} 69 if(i>=40) {add(40);i-=40;} 70 if(i>=30) {add(30);i-=30;} 71 if(i>=20) {add(20);i-=20;} 72 if(i>=10) {add(10);i-=10;} 73 if(i>=9) {add(9);i-=9;} 74 if(i>=8) {add(8);i-=8;} 75 if(i>=7) {add(7);i-=7;} 76 if(i>=6) {add(6);i-=6;} 77 if(i>=5) {add(5);i-=5;} 78 if(i>=4) {add(4);i-=4;} 79 if(i>=3) {add(3);i-=3;} 80 if(i>=2) {add(2);i-=2;} 81 if(i>=1) {add(1);i-=1;} 82 } 83 total[int (‘i‘)]==0? :cout<<‘I‘<<‘ ‘<<total[int (‘i‘)]<<endl; 84 total[int (‘v‘)]==0? :cout<<‘V‘<<‘ ‘<<total[int (‘v‘)]<<endl; 85 total[int (‘x‘)]==0? :cout<<‘X‘<<‘ ‘<<total[int (‘x‘)]<<endl; 86 total[int (‘l‘)]==0? :cout<<‘L‘<<‘ ‘<<total[int (‘l‘)]<<endl; 87 total[int (‘c‘)]==0? :cout<<‘C‘<<‘ ‘<<total[int (‘c‘)]<<endl; 88 total[int (‘d‘)]==0? :cout<<‘D‘<<‘ ‘<<total[int (‘d‘)]<<endl; 89 total[int (‘m‘)]==0? :cout<<‘M‘<<‘ ‘<<total[int (‘m‘)]<<endl; 90 return 0; 91 }不解释,Otz大神