Roman Numerals ---解题报告

 又是一道ACM题。这题很早前看过的,但是当时没怎么想。今天受人之托,认真做了下,发现也不怎么难。这题做的好高兴,时间,代码长度都比较靠前,虽然数据是随机的,时间上带有偶然性,不过确实很兴奋。最重要的是,一次AC,呵呵。

 

 

题目出处:

北大:http://acm.pku.edu.cn/JudgeOnline/problem?id=1213

吉大:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1800&off=1800

 

题目描述:

给定一个式子(只含下面给定的字符),判断在罗马数字表达式里,是不是成立(成立,输出correct ,否则输出Incorrect) 。对于阿拉伯数字是不是成立 (如果只有一个,则是vaild;多个,则是ambiguous;不可能,则是impossible)。

罗马数字里:

I1      V5
X10      L50
C100      D500
M1000       

阿拉伯数字里:

只要不同的字符对应的数字不同,而且没有前缀0就行了。

 

题目中,还列举了一些规则,这些都不用管的,只要知道,对于罗马的,如果连续二个字符中,第一个字符对应的数小于第二个字符对应的数,则第一个数为负数。其余的都是正数,直接加起来就行了。

 

输入:

一个字符串,

输出:

上面已经指出了。

 

 

思路:

1。判断罗马数字很简单,因为输入的格式都是正确的,直接根据上面规则就行了。

2。难点在于判断是不是阿拉伯的。我的做法是,先统计出现的不同字符。然后用回溯。假设每个数字对应0~9的情况。

如果超过两种,直接返回,这样算是一个剪枝。用一个visit[]标志,该数字是不是被其他字符用过的。回溯,给每个字符赋值。然后再判断式子成不成立 。

 

 

代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值