码迷,mamicode.com
首页 > 其他好文 > 详细

TYVJ P1070 罗马数字 Label:一定要看的模拟

时间:2016-08-23 20:27:48      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

描述

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

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

TYVJ P1070 罗马数字 Label:一定要看的模拟

标签:

原文地址:http://www.cnblogs.com/radiumlrb/p/5800647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!