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 百位级
所以可以单独考虑每一位的情况
于是我们可以...打表?
打出每一位的数的情况
分别对应:下标标号 字母 和 字母所代表的数值
千位:: : :
百位:: : : : : : : : :
十位:: : : : : : : : :
个位:: : : : : 4: : : :

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\n",ans[i],res[i]); 88 return 0; 89 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现