USACO 2.2 分析

 题目一:Preface Numbering

题目大意:求1——N之间的十进制数用罗马数字表示时给个字母要用几次(IVXLCDM)

算法:枚举

基本思想是枚举每一个数字分别转换成罗马形式统计再统计,但这种方法很多东西重复了,更简单的方法是统计各个数字在各位上的出现情况,然后做一张表。因为不同数字在不同位的情况很少只有9*Length种,具体实现的细节在代码中有解释

 

题目二:Subset Sums

题目大意:把1——N分成两组,每组的和要相等,这样的分法有多少种

算法:Dynamic Programming--背包

容易想到和背包有很多类似的地方,所以可以借鉴背包的思想,s[i]表示当前无论以哪个数字结尾的和为i的排列的种数,难点在于不重复。

但是也容易发现,只要把最后的N固定住就可以了;或者是最终的答案分为两类,以N结尾的刚好一半,以下是前一种解法

题目三:Runround Numbers

题目大意:给定一个数,找到最小大于此数的符合规则的数。

算法:枚举

依次增大判断的数,先去判断数字有否重复,再去判断是否符合规则,由于次数给定,所以能够一次性确定下一个判断的数位

题目四:Party Lamps

题目大意:开始时N盏灯都是亮着的,有四种操作可以转变灯的亮暗情况,给定N,C(操作的总次数),以及最后某些灯的亮暗情况,求出所有符合的最终的灯的情况

算法:DFS

注意到一个操作两次等于不操作,所以四种操作最终产生2^4 = 16种情况,至于操作次数,只要有用的不大于实际的,并且相差2的倍数就行,最后把得到的字符串排序

优化:还有一个很大的优化就是重复性,每6个一个重复,发现了这个,尽管大胆干吧。

猜你喜欢

转载自blog.csdn.net/zjsxzjb/article/details/6181544
2.2