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

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    POJ-3468 A Simple Problem with Integers(线段树、段变化+段查询、模板)
    CSUOJ-1978 LXX的图论题(最短路、Bellman-Ford判断负圈)
    CSU-1975 机器人搬重物(BFS)
    POJ-3522 Slim Span(最小生成树)
    POJ-1733 Parity game (并查集)
    libmysqlclient.so.16未找到方法
    python 不同目录间的模块调用
    python模块详解 logging
    python模块详解 re
    python模块详解 hashlib
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/5800647.html
Copyright © 2020-2023  润新知