【USACO编程竞赛题】密码算术(Cryptarithms)

下面是密码算术最著名的一道密码加法题 - SEND MORE MONEY 的每个字母都代表一个数字,相同字母代表相同数字,不同字母代表不同数字,所有数字需要满足加法运算的结果。 下面的图例演示了逻辑推理过程,大家看看是否可以理解为什么第一个破译的数字是1,第二个是0,…..,以此类推直到最后一个数字。 第一步:字母 M 替换为 1 第二步:字母 O 替换为 0 第三步:字母 S 替换为 9 第四步:字母 R 替换为 8 第五步:字母 E 替换为 5, 字母 D 替换为…

【USACO编程竞赛练习题】断开的项链

一个项链由红蓝白三色珠子随机组成,珠子总数大于3小于350。找出一个分割点,从该点往前单色珠子数量加上往后的单色珠子数量为最大,白色珠子可以当作红蓝任意一个颜色处理。 给定一个字符串代表珠子的组成,其中字母 w 代表白色珠子,字母 b 代表蓝色珠子,字母 r 代表红色珠子。 输入样例: "wwwbbrwrbrbrrbrbrwrwwrbwrwrrb" 输出样例: 11 上面的输入样例可以用下图来表示,从图中黄色短线处分割,前后有六个蓝色珠子和加五个红色珠子,总共11个珠子为最大值。 【算法思路】 方法一:暴力破解我们可以采取暴力破解的方法,循环项链的每一个珠子,检查当前位置前后单色珠子的数量之和,这样就可以找出最大值。注意输入样例是一个字符串,所以我们需要重复检查字符串开始和结束的位置以模拟完整项链的情形。时间复杂度:O(n2)方法二:DP 动态规划将两个相同的输入字符串连接在一起,这样就可以将环形搜索改成线性搜索。然后检查每一个断点的前后单色珠子数量。时间复杂度:O(n) 下面的动图展示了搜索的过程。

USACO 编程竞赛概要:初级通关练习题# 3

由a、b、c三个字母组成的一串字符串首尾相连,a/b/c字母的排列无序,字符串总长度为3到300之间。任意选择一个点,统计从该点往前计数同一字母的数量,加上该点往后另外一个相同字母的数量之和。字母a既可以当做字母b来计数,也可以作为字母c来计数。计算这一组字符串可以找到前后两组字母之和的最大值。 输入样例: 30aaabbcacbcbccbcbcacaacbaacaccb 输出样例: 12 上面的输入样例如果首尾相连,可以看作下面两串相同的字符串连接在一起: aaabbcacbcbccbcbcacaacbaacaccb|aaabbcacbcbccbcbcacaacbaacaccb ccccccb|bbbbb 6c + 6b = 12 字符串最后的七个字母:aacaccb 可以看作 ccccccb,字符串开始的五个字母:aaabb 可以看作 bbbbb。这样首尾相加就是12个字母。12也是这一组字符串中可以找到符合要求的字母数最大值。

USACO 编程竞赛概要:初级通关练习题# 2

在西方文化中,13号星期五称为黑色星期五。给定一个数字N,统计从1900年开始的N年间,每个月份的13号从周一到周日分别有多少个。 备注:1900年1月1号是星期一。闰年的计算方法是:世纪年(可以被100整除的年份)如果可以被400整除就是闰年,非世纪年份如果可以被4整除就是闰年。闰年的二月份是29天,普通年份的二月份是28天。 输入样例: 120 输出样例: 206 205 204 206 207 205 207 上面的输入样例是120,也就是需要计算从1900年到2020年间的 120 x 12 = 1440 个13号里面,从周一到周日分别有多少天。 输出样例的结果:周日206天,周一205天,周二204天,周三206天,周四和周六都是207天,黑色星期五是205天。

USACO 编程竞赛概要:初级通关练习题# 1

给定两个都是大写字母的字符串,把每个字母转换成数字后相乘(字母A转换为1,B转为2,C转为3...... Z转为26),连乘的结果再除以47得到余数,如果两个余数相等就输出“SAME”,如果不同就输出“DIFFERENT”。 输入样例: BJEFXYARZHSR 输出样例: SAME 字母转换为数字后的结果如下: B J E F X Y2 10 5 6 24 25A R Z H S R1 18 26 8 19 18 每个字符串的数字相乘后再除以47得到的余数都是27,所以输出的结果为 SAME。…