SRM 144-149
2009-06-07 10:17 老博客哈 阅读(2864) 评论(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
题意: 统计一个串中的字符出现在一个字符串数组中的次数
解答: 一遍循环
题意: 有一个不能显示小数的百分比计时器,给定一个工作完成所需要的时间,问能够渐进的显示多少次整数百分比
解答: 我是找规律找出来的-_- 枚举percent (后来看到解答结果其实就是gcd(总秒数,100) - 1,真神奇)
题意: 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]即可
题意: 统计w*h的长方形中所有的长方形(不包括正方形)的个数
解答: 推导公式: w*(w + 1)*h*(h + 1) / 4 - ∑(w - k + 1) * (h - k + 1) k的范围在[1, min(w,h)]
题意: 经典的过桥问题,见我的这篇文章《过桥问题》(范围限定在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次的时候所有女士出列的原始站队方式
解答: 范围比较小,直接模拟
题意: 给定若干条项链,问将这些项链串接起来需要剪下多少个长度为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
题意: 计算一个十进制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为价格数组的长度)。