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

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

不能复合嵌套什么的 总结一下就只有这样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$

 /*
ID: Starry21
LANG: C++
TASK: preface
*/
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define N 70
#define ll long long
#define INF 0x3f3f3f3f
int n,res[];
char ans[]={'L','I','V','X','L','C','D','M','Y','T'};
/*
打出每一位的数的情况
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
*/
int tt[][]/*thousand table*/,ht[][],et[][]/*tens*/,st[][];
void Init()
{
tt[][]=,tt[][]=,tt[][]=;
ht[][]=,ht[][]=,ht[][]=,ht[][]=,ht[][]=,ht[][]=;
ht[][]=,ht[][]=,ht[][]=,ht[][]=,ht[][]=;
ht[][]=,ht[][]=,ht[][]=;
et[][]=,et[][]=,et[][]=,et[][]=,et[][]=,et[][]=;
et[][]=,et[][]=,et[][]=,et[][]=,et[][]=;
et[][]=,et[][]=,et[][]=;
st[][]=,st[][]=,st[][]=,st[][]=,st[][]=,st[][]=;
st[][]=,st[][]=,st[][]=,st[][]=,st[][]=;
st[][]=,st[][]=,st[][]=;
}
void work(int x)
{
int cnt=;
while(x)
{
cnt++;
int t=x%;
if(cnt==)
{
for(int i=;i<=;i++)
res[i]+=st[t][i];
}
if(cnt==)
{
for(int i=;i<=;i++)
res[i]+=et[t][i];
}
if(cnt==)
{
for(int i=;i<=;i++)
res[i]+=ht[t][i];
}
if(cnt==)
{
for(int i=;i<=;i++)
res[i]+=tt[t][i];
}
x=x/;
}
}
int main()
{
//freopen("preface.in","r",stdin);
//freopen("preface.out","w",stdout);
Init();
scanf("%d",&n);
for(int x=;x<=n;x++)
work(x);
for(int i=;i<=;i++)
if(res[i])
printf("%c %d\n",ans[i],res[i]);
return ;
}

Code

USACO2.2 Preface Numbering【思维+打表】的更多相关文章

  1. USACO 2.2 Preface Numbering

    Preface Numbering A certain book's prefaces are numbered in upper case Roman numerals. Traditional R ...

  2. Preface Numbering

    链接 分析:先打表需要用到的罗马数字,然后暴力转换,最后统计一下即可 /* PROB:preface ID:wanghan LANG:C++ */ #include "iostream&qu ...

  3. Preface Numbering序言页码

    题面 (preface.pas/c/cpp) 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,以下是标准数字表: I 1 V 5 X 10 L 50 C 100 D 500 M ...

  4. 【USACO 2.2】Preface Numbering (找规律)

    求 1-n 的所有罗马数字表达中,出现过的每个字母的个数. 分别对每个数的罗马表达式计算每个字母个数. 对于十进制的每一位,都是一样的规则,只是代表的字母不同. 于是我们从最后一位往前考虑,当前位由字 ...

  5. USACO Section 2.2: Preface Numbering

    搬了leetcode的代码 /* ID: yingzho1 LANG: C++ TASK: preface */ #include <iostream> #include <fstr ...

  6. USACO Preface Numbering 构造

    一开始看到这道题目的时候,感觉好难 还要算出罗马的规则. 但是仔细一看,数据规模很小, n 只给到3500 看完题目给出了几组样例之后就有感觉了 解题方法就是: n的每个十进制数 转换成相应的罗马数字 ...

  7. ACM-ICPC 2018 南京赛区网络预赛 J Sum (思维+打表)

    https://nanti.jisuanke.com/t/30999 题意 f(i)表示i能拆分成两个数的乘积,且要求这两个数中各自都没有出现超过1次的质因子的方案数.每次给出n,求∑(n,i=1)f ...

  8. Problem E. Matrix from Arrays(杭电2018年多校第四场+思维+打表找循环节)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6336 题目: 题意:给你一个l个元素的数组a,用题目中的程序构造一个新的矩阵,询问q次,问以(x1,y ...

  9. USACO Section2.2 Preface Numbering 解题报告 【icedream61】

    preface解题报告----------------------------------------------------------------------------------------- ...

随机推荐

  1. k8spod控制器概述

    自主式pod对象由调度器绑定至目标工作节点后即由相应节点上的kubelet负责监控其容器的存活性,容器主进程崩溃后,kubelet能够自动重启相应的容器.不过,kubelet对非主进程崩溃类的容器错误 ...

  2. vue设置全局query参数

    router.beforeEach((to, from, next) => { // 设置全局店铺ID shopid const shopid = from.query.shopid // 如果 ...

  3. 如何配置IIS使其支持APK/WGT文件的下载

    1.打开Internet 信息服务(IIS)管理器: 2.选择需要配置的网站: 3.右侧功能界面双击进入“MIME类型”: 4.点击右侧“添加”按钮,在弹出窗口里文件扩展名输入:apk,MIME类型输 ...

  4. wx小程序知识点(五)

    五.双向绑定和 vue 的区别 ① vue 中实现双向绑定只需要修改 this.data var vm = new Vue({ el: '#example', data: { message: 'He ...

  5. python使用配置文件

    通过配置文件将变量暴露给用户修改 标准库模块configparser,从而可在配置文件中使用标准格式. 必须使用[files].[colors]等标题将配置文件分成几部分(section).标题的名称 ...

  6. 在qt的QOpenGLWidget开启opengl的抗锯齿

    在QOpenGLWidget的构造函数添加下面几句代码即可 QSurfaceFormat surfaceFormat; surfaceFormat.setSamples();//多重采样 setFor ...

  7. BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增

    建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...

  8. [shell]管道连接的命令判断返回值

    场景: 在bash执行管道连接的命令,需要获取到各个命令的返回值用于判断 在脚本中我们可能需要将执行结果打印到屏幕,同时保存在文件中供后面分析用,写出如下的命令 command 2>&1 ...

  9. BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...

  10. UMG里没有"Prefab"怎么办?

    大家知道在Unity里做UI,利用Prefab是少不了的,但是在UE4里如何做呢? 这是实际工作中遇到的问题,我Google关键词“UMG Prefab","UMG resuabl ...