TYVJ P1070 罗马数字 Label:一定要看的枚举

描述

一类书的序言是以罗马数字标页码的。传统罗马数字用单个字母表示特定的数值,以下是标准数字表: 

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大神

posted @ 2016-08-23 19:45  Radiumlrb  阅读(277)  评论(0编辑  收藏  举报