zoukankan      html  css  js  c++  java
  • USACO2.2 Preface Numbering【思维+打表】

    这道题乍一看没有什么思路,细看还是没有什么思路

    嗯,细看还是可以看出些什么端倪。

    不能复合嵌套什么的 总结一下就只有这样3种规则:

    1.IXCM最多三个同样连续 加起来
    2.递减:加起来 注意VLD不连续出现
    3.IXCM在比它大1级或2级的数前面 表示减

    罗马数字各位独立
    应该比较显然吧 如果去掉最高位 剩下的数用罗马数字表示的结果是一样的
    在全加的情况下 更显然了:
    比如268=100+100+50+10+5+1+1+1=CCLXVIII
    68=50+10+5+1+1+1=LXVIII

    有减法的情况下:由于一个可表示为10n的数出现在一个比它大1级或2级的数前
    所以减法是在它对应的数量级运算的
    1.1&5 1&10 个位级
    2.10&50 10&100 十位级
    3.100&500 100&1000 百位级

    所以可以单独考虑每一位的情况
    于是我们可以...打表?

    打出每一位的数的情况

    分别对应:下标标号 字母 和 字母所代表的数值
    $1$ $I$ $1$ 
    $2$ $V$ $5$ 
    $3$ $X$ $10$
    $4$ $L$ $50$ 
    $5$ $C$ $100$
    $6$ $D$ $500$ 
    $7$ $M$ $1000$
    千位:$3$:$MMM$ $2$:$MM$ $1$:$M$
    百位:$9$:$CM$ $8$:$DCCC$ $7$:$DCC$ $6$:$DC$ $5$:$D$ $4$:$CD$ $3$:$CCC$ $2$:$CC$ $1$:$C$
    十位:$9$:$XC$ $8$:$LXXX$ $7$:$LXX$ $6$:$LX$ $5$:$L$ $4$:$XL$ $3$:$XXX$ $2$:$XX$ $1$:$X$
    个位:$9$:$ IX$ $8$:$VIII$ $7$:$VII$ $6$:$VI$ $5$:$V$ 4:$IV$ $3$:$III$ $2$:$II$ $1$:$I$

     1 /*
     2 ID: Starry21
     3 LANG: C++
     4 TASK: preface                 
     5 */  
     6 #include<iostream>
     7 #include<string>
     8 #include<cstdio>
     9 #include<cstring>
    10 #include<vector>
    11 #include<algorithm>
    12 #include<queue>
    13 using namespace std;
    14 #define N 70
    15 #define ll long long
    16 #define INF 0x3f3f3f3f
    17 int n,res[10];
    18 char ans[10]={'L','I','V','X','L','C','D','M','Y','T'};
    19 /*
    20 打出每一位的数的情况
    21 1 I 1 
    22 2 V 5 
    23 3 X 10 
    24 4 L 50 
    25 5 C 100 
    26 6 D 500 
    27 7 M 1000
    28 千位:3:MMM 2:MM 1:M 
    29 百位:9:CM 8:DCCC 7:DCC 6:DC 5:D 4:CD 3:CCC 2:CC 1:C
    30 十位:9:XC 8:LXXX 7:LXX 6:LX 5:L 4:XL 3:XXX 2:XX 1:X
    31 个位:9: IX 8:VIII 7:VII 6:VI 5:V 4:IV 3:III 2:II 1:I
    32 */
    33 int tt[4][10]/*thousand table*/,ht[10][10],et[10][10]/*tens*/,st[10][10];
    34 void Init()
    35 {
    36     tt[3][7]=3,tt[2][7]=2,tt[1][7]=1;
    37     ht[9][5]=1,ht[9][7]=1,ht[8][5]=3,ht[8][6]=1,ht[7][5]=2,ht[7][6]=1;
    38     ht[6][5]=1,ht[6][6]=1,ht[5][6]=1,ht[4][5]=1,ht[4][6]=1;
    39     ht[3][5]=3,ht[2][5]=2,ht[1][5]=1;
    40     et[9][3]=1,et[9][5]=1,et[8][3]=3,et[8][4]=1,et[7][3]=2,et[7][4]=1;
    41     et[6][3]=1,et[6][4]=1,et[5][4]=1,et[4][3]=1,et[4][4]=1;
    42     et[3][3]=3,et[2][3]=2,et[1][3]=1;
    43     st[9][1]=1,st[9][3]=1,st[8][1]=3,st[8][2]=1,st[7][1]=2,st[7][2]=1;
    44     st[6][1]=1,st[6][2]=1,st[5][2]=1,st[4][1]=1,st[4][2]=1;
    45     st[3][1]=3,st[2][1]=2,st[1][1]=1;
    46 }
    47 void work(int x)
    48 {
    49     int cnt=0;
    50     while(x)
    51     {
    52         cnt++;
    53         int t=x%10;
    54         if(cnt==1)
    55         {
    56             for(int i=1;i<=7;i++)
    57                 res[i]+=st[t][i];
    58         }
    59         if(cnt==2)
    60         {
    61             for(int i=1;i<=7;i++)
    62                 res[i]+=et[t][i];
    63         }
    64         if(cnt==3)
    65         {
    66             for(int i=1;i<=7;i++)
    67                 res[i]+=ht[t][i];
    68         }
    69         if(cnt==4)
    70         {
    71             for(int i=1;i<=7;i++)
    72                 res[i]+=tt[t][i];
    73         }
    74         x=x/10;
    75     }
    76 }
    77 int main() 
    78 {
    79     //freopen("preface.in","r",stdin);
    80     //freopen("preface.out","w",stdout);
    81     Init();
    82     scanf("%d",&n);
    83     for(int x=1;x<=n;x++)
    84         work(x);
    85     for(int i=1;i<=7;i++)
    86         if(res[i])
    87             printf("%c %d
    ",ans[i],res[i]);
    88     return 0;
    89 }
    Code
  • 相关阅读:
    typescript 深层次对象内层(N)转外层(N),支持多层级递归转换,多应用于多语言数据结构转换
    js 柯里化、深拷贝、浅拷贝
    js IntersectionObserver api
    javascript-state-machine
    NodeJs的CommonJS模块规范
    js 动画
    【THUPC 2018】赛艇
    【CF528D】Fuzzy Search
    【UR #6】懒癌
    【HNOI 2019】JOJO
  • 原文地址:https://www.cnblogs.com/lyttt/p/11660461.html
Copyright © 2011-2022 走看看