Codeforces Round #206(Div. 2)

A. Vasya and Digital Root

题意:给定计算规则(1)S(n)为n的各位上的数字之和;(2)dr(n) = S(n), if S(n) < 10;(3)dr(n) = dr(S(n)), if S(n) ≥ 10。现输入一个k(1 <= k <= 10 ^ 1000)和d(0 <= d <= 9),要求求一个k位数x使得dr(x) = d,且x不能有前导0(数字0本身除外);若不存在这样的数,则输出"No solution"。

思路:乍一看,好像很难,但不要忘了,它是只有500分的A题啊。我们注意到,d的范围是[0, 9],那么,我们可以分为以下两种情况考虑:

(1)k != 1 && d == 0:因为不能有前导0,所以并不存在这样的k位数;

(2)除(1)外的情况:最高位为d,其它位为0。


B. Vasya and Public Transport

题意:对于公交与电车共有下面四类票:(1)类:能乘坐一次公交或一次电车,价格为c1;(2)类:能无限次乘坐某一辆公交或某一辆电车,价格为c2;(3)能无限次乘坐所有的公交或者所有的电车,价格为c3;(4)能乘坐无数次的公交和电车,价格为c4。现在,列出需要乘坐的n趟公交的次数(ai)及m趟电车的次数(bi),求最小花费。

思路:既然有这些票,我们不妨也将乘坐方法分类:1类:买第(4)类票;2类:买两张第(3)类票;3类:为公交买一张(2)类票或者根据min(c2, bi * c1)贪心,选择最小的;为电车买一张(2)类票或者根据min(c2, ai * c1)贪心选择,选取最小的。最终结果为4类中选最小的。


C. Vasya and Robot

题意:n(1 <= n <= 10 ^ 5)个整数序列w1, w2, ... , wn,表示n个物体的重量。现在,机器去搬运它们。机器分左右手,最左边的物体只能用左手搬,每次消耗能量为l* wi;最右边的物体只能用右手搬,每次消耗能量为r* wi。另外,如果前一次是左手,这次还用左手,消耗能量要另加Ql;如果前一次是右手,这次还用右手,消耗能量要另加Qr。求搬完这些需要消耗的最少能量。

思路:比赛的时候,一点想法都没有。赛后,看了人家的代码,如醍醐灌顶。我们需要将思绪稍微转化一下。假设左手搬的物体为L个,右边搬的物体为n - L个,中间无论左右手使用顺序如何,最终都可以等价于:先左右交叉搬运min(L, n - L)个,然后,接下来就全部用左手或全部用右手搬运了。这样子,我们只要将L遍历一次就行了。


D. Game with Strings

这题到现在题目都没看懂。


E. Vasya and Beautiful Arrays

题意:给一串数字ai,再给k,且每个ai可以减去一个不大于k的数,求能找到的最大的公约数。

思路:赛后发现排序之后用暴力也能过,顿时后悔不已。而且,题目数据有问题,说好的ai小于10 ^ 6的,结果开10 ^ 6 + 5的数组会越界,要开到两倍才行。解题报告给的方法是这样的:我们将问题转化一下,假设我们要求的结果是d,那么,题意要求d >= ai 且 ai % d <= k。我们知道,任意一个ai都在[d, d + k], [2d,2d + k], ... ,[pd, pd + k]的某区间上,其中p = max(ai) / d,且这些区间是没有交集的,假设落在[l, r]区间上的ai个数为c。因为d >= ai,所以,可以从d = min(ai)往下搜索,如果c[d, d + k] + c[2d, 2d + k] + ... + c[pd, pd + k] == n,那么这个d就是最大的了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值