zoukankan      html  css  js  c++  java
  • 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage

    2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage

    A. Union of Doubly Linked Lists

    题目描述:给出很多个双向链表,将它们连成一个双向链表。

    solution
    模拟,尾连头。
    时间复杂度:(O(n))

    B. Preparing for Merge Sort

    题目描述:给出(n)个不同的数(a_i),从左到右找出上升的子序列,删除,继续找,直至所有的数被删除。输出每一次找出的子序列。

    solution
    从左到右枚举,同时维护所有的上升序列。可以得出,靠前的序列的最后一个数是较大的,因此可以二分出当前的数(a_i)应该在哪一个数列。例如:
    (1, 3, 2, 5, 4)

    (1)

    (1, 3)

    (1, 3)
    (2)

    (1, 3, 5)
    (2)

    (1, 3, 5)
    (2, 4)

    时间复杂度:(O(nlogn))

    C. Sum of Nestings

    题目描述:给出(n, k),求出一个有(n)对括号的括号序列,使得该括号序列所表示的数值为(k),或无解。一个括号的括号序列是这样算的:一对括号里面有多少对括号,该对括号的值就是多少,然后将所有对括号的值相加就是括号序列的值。例如:()(())的值为(1), (((())))的值为(6)

    solution
    显然当(k>frac{n(n-1)}{2})时,无解。然后将题目的值等价为每对括号的贡献,即在最里面的括号的贡献最大。所以可以按照贪心策略不断地在外层加括号,加到最大后减一层,继续加括号,直至得到答案。例如:(n=4, k=5)
    ((( 的值为(3),不能再继续往外加。
    (((),减一层
    ((()(的值为(5),已为答案
    ((()())),补全,即为答案。
    时间复杂度:(O(n))

    D. Dog Show

    题目描述:开始时,数轴上(1)~(n)的位置上都有食物,每个位置上的食物到了(t_i)时刻才能吃。开始时有一只狗在(0)的位置,它只能向右走,不能向左走。向右走一个单位需要一个单位的时间,吃东西不需要时间,当它到了某个位置时,如果食物能吃,则吃,否则有两个选择,一是等,二是直接跳过向右走。问在(T)时刻内最多能吃多少食物,注意:如果狗恰好在(T)时刻到了某个食物前,那个食物是不能吃到的。

    solution
    首先想到如果需要等,则在一开始出发时就等就好了。
    假设等的时间为(wait),则(x=i)的食物能吃到的条件是(t_i leq wait+i <T)
    移项得:(t_i - i leq wait < T-i)
    假设在(T)时刻时狗要跑到(x=i)处,则(wait)最大为(T-i),因为前面的尽量要吃到,所以(wait)取最大值,而(T-i)会随(i)的增大而变小,即有单调性,所以可以用优先队列维护(t_i-i),在(i)不断增大时更新答案。
    时间复杂度:(O(nlogn))

    E. Packmen

    题目描述:有一个(1 imes n)的网格,每个网格要么是*, 要么是P,要么是.P可以随意移动,遇到*的格子会把*吃掉。每个格子可以有多个PP移动一格需要一个单位的时间,吃掉*不需要时间,问最短需要多长时间能吃掉所有*

    solution
    二分答案。然后从左到右分配好每个P吃哪些*。每个P有两种走法:先向右走,再向左走;或先向左走,再向右走。处理一下就好了。

    时间复杂度:(O(nlogn))

    F. Berland Elections

    题目描述:有一场选举,有(n)个候选人,(m)个选民,(k)个席位。选举结束后,按选票的多少将候选人排序,票数相同的按最后一张选票靠前的排在前面。然后前(k)个人当选,但若前(k)个人中有人一张选票都没有,则这个人不能当选,后面的人无须补上,即最后当选人数有可能少于(k)。现有(a)个人已经投票,且知道他们投给谁,问每个候选人人属于下列的那种情况:

    1. 一定能当选
    2. 可能能当选
    3. 一定不能当选

    solution
    第一种情况:第(i)个候选人现在排在前(k)位,且票数大于(0),且将排在他后面的人移到他之前并使他掉出前(k)位所需票数大于(m-a)
    第三种情况:剩下的(m-a)张票都投给他也不能将他移至前(k)位。
    剩下的均为第二种情况。
    时间复杂度:(O(n^2))

    G. University Classes

    题目描述:有(n)组人,每组人在某些时间需要占用一间课室,占有的时间用一个(7)位二进制数表示。问最少需要多少间课室。

    solution
    模拟,二进制的每一位最多有多少个(1)
    时间复杂度:(O(n))

    H. Load Testing

    题目描述:给出一个序列(a_i),将某些数增大,使得该序列变成一个先严格上升,再严格下降的序列,求出最少的增值和(每个数的增值可以不一样)

    solution
    先预处理当(i)为山峰时(1)~(i)的增值和,以及(i)(n)的增值和,还有相对应的(i)的峰值。然后枚举山峰,通过预处理的值可以得出答案。

    时间复杂度:(O(n))

    I. Noise Level

    题目描述:有一个(n imes m)的网格,每个网格要么是住宅,要么是障碍,要么是噪声源。每个噪声源对每个格子的影响为(frac{q}{2^d}),其中(d)为噪声源到格子的最短距离(路径中不能有障碍,不能越出边界),若不能连通,则(d)为无穷大。求噪音总和大于(p)的格子有多少个。

    solution
    因为(q)比较小,所以直接暴力就好了。

    时间复杂度:(O(nm(logq)^2))

    J. Students Initiation

    题目描述:给出一个无向图,将其变成有向图,使得每个点的出度最大值最小,输出出度最大的最小值和有向图。

    solution
    二分答案,然后边与点连边,跑一次网络流判断是否可行。

    时间复杂度:不可估计

    K. Travel Cards

    题目描述:依次乘坐(n)条路线(有重复),车票为(a)元,换乘为(b)元(路线(i)的终站与(i+1)的起点相同时为换乘)。现在可以为不多于(k)条线路买交通卡,每张卡的费用为(f),买卡后,乘坐该路线(双向)不用给钱,问乘坐这(n)条线路最少需要多少钱。

    solution
    首先若没有交通卡,则每一条路线的钱是知道的,所以可以将每条线路的花费总和算出来,从大到小排序,若买卡比较便宜,则买卡,否则不买。

    时间复杂度:(O(nlogn))

    L. Berland SU Computer Network

    题目描述:有一个树,给出这棵树的每一个节点的每一个分叉连着的是哪些点,还原这棵树,或无解。

    solution
    若有解,则每次找只有一个分叉的点,这些点为叶子节点,然后在其它点的分叉删掉这些点,若某个点的分叉删点该叶子节点后分叉减少,则这个点连着叶子节点。不断重复,直至所有点删除。
    无解情况则是在找到这棵树后构出每个节点的分叉连着的点,与输入对比,若不同,则无解。
    时间复杂度:(O(n^2))

    M. Weather Tomorrow

    题目描述:给出一个序列,判断它是否时等差数列,若是,则输出序列的下一项,否则输出序列的最后一项。

    solution
    求公差,枚举判断。

    时间复杂度:(O(n))

  • 相关阅读:
    新项目反思
    nei网访问
    react
    css沉默
    沉默
    node准备
    C++学习(八):删除文件
    利用工具格式化日期文本
    PageHelper 记录总条数不正确问题处理
    tk.mybatis 多个or条件拼接
  • 原文地址:https://www.cnblogs.com/GerynOhenz/p/8366288.html
Copyright © 2011-2022 走看看