zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 100 (Rated for Div. 2) 题解(A-E)

    AC代码

    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)

    那么有:

    [S_1 = sum_{i = 1}^n |a_i - b1_i|\S_2 = sum_{i = 1}^n |a_i - b2_i|\S_1 + S_2 = sum_{i = 1}^n (a_i - 1) = S - n ]

    由此可以得出:(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)是否在这个区间内就可以了

    注意,这道题要用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)之后,可以将一条链上的点都缩到一个点上,遇到链首,就把整条链都加进答案,那么这道题就可以转化为经典拓扑排序。

  • 相关阅读:
    计算机操作系统之进程管理
    剑指offer——两个链表的第一个公共结点
    剑指offer——数字在排序数组中出现的次数
    剑指offer——二叉树的深度与平衡二叉树的判断
    剑指offer——数组中只出现一次的数字
    剑指offer——和为s的两个数字VS和为s的连续正数序列
    剑指offer——翻转单词顺序VS左旋转字符串
    剑指offer——扑克牌的顺子
    剑指offer——圆圈中最后剩下的数字
    剑指offer——求1+2+...+n
  • 原文地址:https://www.cnblogs.com/zengzk/p/14152994.html
Copyright © 2011-2022 走看看