QOJ.ac

QOJ

時間限制: 2.0 s 記憶體限制: 256 MB 總分: 100

#9386. 自由罗马数字

统计

小玛莎已经学会了计数,现在她正在学习罗马数字。在当今的用法中,罗马数字通常由大写字母组成的字符串表示,其对应的值如下:“I”为 1,“V”为 5,“X”为 10,“L”为 50,“C”为 100,“D”为 500,“M”为 1000。

我们从左到右阅读罗马数字。在简单的情况下,字母按值从大到小排列,数值等于所有字母值的总和。此外,有时较小的值会出现在较大的值之前,此时较小的值不加到结果中,而是从结果中减去:例如,“IV”的值为 4,“IX”的值为 9。遗憾的是,这些规则还设定了各种限制:例如,数字 4 表示为“IV”而不是“IIII”,数字 999 表示为“CMXCIX”而不是“IM”……

玛莎不喜欢普通罗马数字的限制,于是她发明了自己的记数法:自由罗马数字。这些数字也由具有相同值的相同字母组成的字符串表示,处理方式如下:从左到右考虑这些字母。每个字母将其值加到结果中。此外,如果一个字母 $c$ 的前面紧邻着一个值较小的字母,则执行以下操作:找到左侧距离最近的字母 $b$,使得其值不小于 $c$ 的值。之后,考虑 $b$ 和 $c$ 之间的字符串 $S$;如果没有这样的字母 $b$,则字符串 $S$ 从整个字符串的开头开始。求出 $S$ 作为自由罗马数字的数值。注意,此时 $S$ 的值已经被加到了结果中,现在将其改为减去(实际上,当前结果减少了 $S$ 值的两倍)。

自由罗马数字和普通罗马数字一样,仅用于正整数。因此,一个字符串只有在上述算法中字符串 $S$ 的值在任何情况下都严格小于字母 $c$ 的值时,才是一个有效的自由罗马数字。

举个例子,考虑自由罗马数字“XIIXL”。前三个字母“XII”分别将 10、1 和 1 加到结果中。下一个字母“X”也加 10,但随后将“II”(即 2)的加法替换为减法,因此结果现在为 $10 + 10 - 2 = 18$。最后,字母“L”将 50 加到结果中,然后将“XIIX”(即 18)的加法替换为减法,因此最终结果为 $50 - 18 = 32$。

玛莎为她的发明感到自豪:她设计了一个比普通罗马数字限制更少的系统,但每个普通罗马数字仍然可以按照玛莎的规则正确读取。她开始将数字从十进制记数法转换为自由罗马记数法,反之亦然,然后思考:如何为给定的数字找到最短的自由罗马记数法?玛莎放下笔,陷入了沉思。

请解决玛莎问题的通用版本。将给定的自由罗马记数法数字转换为十进制,并将给定的十进制数字转换为其最短的自由罗马记数法。

输入格式

输入包含 1 到 10 000 行。每一行表示一个 1 到 3000 之间的整数。每个数字要么以不含前导零的十进制形式给出,要么以自由罗马记数法给出:在这种情况下,该记数法是有效的,包含 1 到 20 个字母,但不一定是最短的。

输出格式

对于每一行输入,打印一行,输出该数字的另一种记数法。具体来说,如果数字以自由罗马记数法给出,则以不含前导零的十进制形式打印。如果数字以十进制给出,则打印其最短的自由罗马记数法。如果有多种可能的各种最短记数法,打印其中任意一种即可。

样例

样例输入 1

IIII
4
CMXCIX
999
XIIXL
32

样例输出 1

4
IV
999
IM
32
IIXXL

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.