A. Dungeon
记每7次攻击为一轮,那么如果要满足给定条件,那么必须要有$a + b + c = 0 ext{ mod 9} $。
其次,假设结束时经历了(t = frac{a + b + c}{9})轮,则必须要有(t ge min(a, b, c))。
满足以上两个要求则YES,否则NO。
B. Find The Array
挺有意思的一道构造题。
构造方法1
首先要注意到1是可以被任何数整除的。根据这个性质,就可以每隔1个位置就放一个1,这样构造必定可以满足条件2。
剩下的位置为了最小化条件3中的(sum_i^n |a_i - b_i|),就令(b_i = a_i)。这样构造还保证了满足条件1。
这样一来,可以生成两种(b):([1, a_2, 1, a_4, ...])和([a_1, 1, a_3, 1, ...])。记前者为(b1),后者为(b2)。
那么有:
由此可以得出:(2 cdot S_1 le S)和(2 cdot S_2 le S)中必有一个成立(可以用反正法证明)。
这样条件3也满足了。
构造方法2
记(k)为使(2^k < a_i)成立的最大的(k),可以让(b_i)等于(2^k)和(2^{k+1})中离(a_i)更近的那个。
这样,就有(|a_i - b_i| le 2^{k - 1} le frac{a_i}{2}),从而满足题目所给条件。
C. Busy Robot
这题就是一道模拟,有一说一没那么好写。
如果机器人正在执行某个命令,那么执行这个命令的开始时间(st),结束时间(ed),起点(cur)和重点(nxt)都算是已知。
- 依次执行命令
- 如果(t_i ge ed)那么这个命令是有效的
- (st = t_i)
- 结束时间等于当前时间加上路程除以时间,即(ed = t_i + abs(x_i - cur))
- (cur = nxt)
- (nxt = x_i)
- 判断当前命令是否成功
- ([t_i, t_{i+1}])这段时间能走过的点构成的区间([l, r])是可以求出来的
- 然后判断(x_i)是否在这个区间内就可以了
- 如果(t_i ge ed)那么这个命令是有效的
注意,这道题要用64位整型。如果使用32位整型,那么如果(t_n = 10^9)且此时刻位于(10^9),且(x_n = -10^9),这样就算令(t_{n+1} = 2^{32} - 1),也会令程序误判最后一道指令为不成功。
D. Pairs
如果要得出(b)至少要使用(need\_ma)次取最大和(need\_mi)次取最小,那么剩下的次数就是任意可用的,而总共有(n + 1)种可能取值,所以满足条件的取值就等于(n + 1 - need\_ma - need\_mi)。
现在只需要求出(need\_mi)和(need\_ma)。以下以(need\_mi)为例:
- 因为(b)是升序排序的,所以从左至右遍历(b),令(delta)为未被使用的数。
- ((b_{i - 1}, b_i))之间的数以及前面未被使用的数,这些都可以用来作为取最大值的令一个参数,和(b_i)一起使用而得出(b)。即(delta += b_i - b_{i - 1} - 1)。
- 如果当前没有可以用来作为取最大的的参数,则必须要使用一次取最小操作。即(need\_ma =need\_ma + 1)。
- 否则,则消耗一个未被使用的数。即(delta = delta - 1)。
同理可以求解(need\_ma)。
E. Plan of Lectures
这题很容易就能想到是拓扑排序。
根据题目条件可以得出有向边((p[i], i))构成的图是一颗树,其次((x_i, y_i))构成多条链或者环。
为了满足(y_i)接在(x_i)之后,可以将一条链上的点都缩到一个点上,遇到链首,就把整条链都加进答案,那么这道题就可以转化为经典拓扑排序。