代码改变世界

SRM 144-149

2009-06-07 10:17  老博客哈  阅读(2858)  评论(5编辑  收藏  举报

SRM 144:

Match Overview: http://www.topcoder.com/stat?c=round_overview&er=5&rd=4515

Match Editorial: http://www.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm144

 

1. Time

题意: 将总秒数Sec转换为"时:分:秒"的格式

解答: 时 = Sec / 3600, 分 = Sec % 3600 / 60, 秒 = Sec % 60

 

2. BinaryCode

题意: 有两个串P和Q,其中P是二进制串(仅含0,1), 两者满足Q[0] = P[0] + P[1], Q[1] = P[0] + P[1] + P[2], Q[2] = P[1] + P[2] + P[3], ...

现给定Q,求以0和1分别打头的P串(如不存在,返回"NONE")

解答: 这种题我认为最好的做法类似于"迷宫加圈"的技巧,在P的两端补0, 这样Q[0] = P[-1] + P[0] + P[1], 可以统一起来.通过一遍遍历,得到P数组,注意需要检查P中是否只是0或者1,并且末尾附加的数字是否为0.(BTW:使用加0的技巧正好解决了当Q长度为1时的情况,否则需要加特判)

 

3. PowerOutage

题意: 给定一个连通的无向图, 起点为0,问从0开始遍历所有点的最短路程

解答: 不难发现,可以将问题等价位把所有的边走两遍,然后减去最后一条从0出发的最长路即可. 求最长路可以用dfs,bfs求解,当然这里如果注意到输入保证起点小于终点,可以用DP求解

 

SRM 145:

Match Overview: http://www.topcoder.com/stat?c=round_overview&er=5&rd=4530

Match Editorial: http://www.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm145

 

1. DitherCounter

题意: 统计一个串中的字符出现在一个字符串数组中的次数

解答: 一遍循环

 

2. ExerciseMachine

题意: 有一个不能显示小数的百分比计时器,给定一个工作完成所需要的时间,问能够渐进的显示多少次整数百分比

解答: 我是找规律找出来的-_- 枚举percent (后来看到解答结果其实就是gcd(总秒数,100) - 1,真神奇)

 

3. VendingMachine

题意: OOXX... 太长了

解答: 模拟题,最好把rotate的过程单独拿出来写,逻辑比较清晰 

 

SRM 146:

Match Overview: http://www.topcoder.com/stat?c=round_overview&er=5&rd=4535

Match Editorial: http://www.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm146

 

1. Yahtzee

题意: 统计9个数字中"出现次数*数字"最大的数

解答: 可以二重循环枚举每一个出现的数字;如果注意到9个数字只有[1,6],可以外层枚举[1,6]即可

 

2. RectangularGrid

题意: 统计w*h的长方形中所有的长方形(不包括正方形)的个数

解答: 推导公式: w*(w + 1)*h*(h + 1) / 4 - ∑(w - k + 1) * (h - k + 1)  k的范围在[1, min(w,h)]

 

3. BridgeCrossing

题意: 经典的过桥问题,见我的这篇文章《过桥问题》(范围限定在6个人以内)

解答: 方法1: 采用《过桥问题》中的线性算法解决; 方法2: 由于人数较少,可以采用bfs或者dfs对桥左边的人进行位压记忆化搜索

 

SRM 147:

Match Overview: http://www.topcoder.com/stat?c=round_overview&er=5&rd=4540

Match Editorial: http://www.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm147

 

1. CCipher

题意: 将一个字符串中的每个字母向左移动shift个位数,例如shift等于1, 'B'变为'A'

解答: (c - 'A' - shift + 26) % 26 + 'A' 

 

2. PeopleCircle

题意: 给定循环战列的m个男士和f个女士,按照约瑟夫一样的方式数k出列,问当玩到f次的时候所有女士出列的原始站队方式

解答: 范围比较小,直接模拟

 

3.GoldenChain

题意: 给定若干条项链,问将这些项链串接起来需要剪下多少个长度为1的小段

解答: 贪心,优先使用较短的项链

 

SRM 148:

Match Overview: http://www.topcoder.com/stat?c=round_overview&er=5&rd=4545

Match Editorial: http://www.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm148

 

1.DivDigits

题意: 计算一个十进制n中,各位上能整除n的个数

解答: 一个小技巧可以把n转换成string来处理;当然直接做也可以

 

2. PeopleCircle

题意: 给定一个串,并给定若干字母的轮换,求转换后的字符串

解答: 直接计算出映射串

 

3. MNS

题意: 给定9个数字,求出有多少种不重复的方法使得这9个数排列成3*3的矩阵,每行每列值相等

解答: next_permutation求解,最坏情况是党9个数字互不相同,才9!  这里也可以直接dfs做,注意判重

 

 

SRM 149:

Match Overview: http://www.topcoder.com/stat?c=round_overview&er=5&rd=4550

Match Editorial: http://www.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm149

 

1. FormatAmt

题意: 格式化货币

解答: 转换成string处理比较方便. 我形成思维定势了,默认只能s += "," 其实大可以 s = "," + s或者 s = ',' + s ,这样避免了Array.Reverse

 

2. BigBurger

题意: 给定一组人先后到达的时间和需要花费的时间,问谁等待时间最长

解答: 保存当前时间,直接模拟

 

3. Pricing

题意: 将价格数组中的数划分成1组,2组,3组或者4组,每个小组的单价为本小组的最低价,求最大的总价值

解答: O(n5)可以见Editorial(方法是枚举4个小组中的最低价格,然后统计总价值);O(n4)可以枚举三个分界的价格,然后统计;O(n3)我是这么做的,

记f(i, j)表示[i,j]区间内所能获得的最大的总价值(i <= j), 那么f(i, j) = Max{(j - k + 1) * price[k]} (i <= k <= j)。特别地,当i>j的时候定义f(i,j)=0。接下来枚举三个边界i, j, k,那么结果为Max{f[0,i] + f[i + 1, j] + f[j + 1, k] + f[k + 1, n - 1]}. (0 <= i < n, i <= j < n, j <= k < n,n为价格数组的长度)。