zoukankan      html  css  js  c++  java
  • noip模拟赛

    T1 elim

    给你一个消消乐游戏的界面,$3$ 个及以上的同色连块会消除,求一次消除之后是什么样的

    sol:模拟

    T2 battleground

    给你一个 $n imes n$ 的棋盘,上面有 $m$ 个玩家,玩家可以向 $8$ 个方向走,有的地方有障碍不能走,不能斜着从两个障碍里面挤过去(大概就是右边有障碍 + 下面有障碍 = 你不能走到右下)。有 $f$ 个回合,每回合会给你一个毒圈,毒圈里面的障碍会无效,所有玩家都会向毒圈里的一个目标(每个人可能目标不一样)走,在毒圈外面走一步会 $-1s$ ,给出每个人初始的生命,求这 $m$个人跑毒结束后还有多少生命 (生命值最低为 $0$ ,去世的玩家生命值视为 $0$ )

    sol:

    因为毒圈里不掉血也没有障碍,所以只要找出每个人走到毒圈里要走多远就可以了

    不妨设他们都要走到毒圈的圆心,于是我们可以从圆心开始 $bfs$ ,圈里走一步代价为 $0$ 

    圈外走一步代价为 $1$ 算出走到每个点的代价就可以算出每个人每轮扣的血了

    T3 greedy

    给你一个求图的独立集的算法,让你模拟

    算法如下:

    1.规约

    step1.删掉所有度为 0 的点加入独立集

    step2.删掉所有度为 1 的点和它相邻的点,并把那个编号小的那个加入独立集

    如果当前不能规约,我们执行下面的

    2.贪心

    step1.找出度最大的点,如果唯一,删掉它

    step2.如果不唯一,找到一个删掉后能使剩下的度数为 1 的点数最多的点,如果还有多个,删掉编号最大的点

    $n leq 10^5$

    $m leq 5 imes 10^5$

    sol:暴力

    维护一个 set / 可删除堆

    堆内维护一个三元组表示 (度,跟它相连且度为 2 的点的个数,编号)

    操作 1 直接做,操作 2 也是直接做

    每个点只有在当做堆顶和度为 1 的时候会执行两次“把周围一圈的点的度 -1 ”

    所以复杂度是对的

  • 相关阅读:
    eclipse恢复界面默认设置
    文件夹的拷贝
    文件的输入输出
    十进制转二进制,八进制,十六进制(查表法)
    数组元素的查找(折半查找)
    C++几个小函数
    C++ 内部排序(一)
    C++实现链表
    C++输出IP地址段内的合法地址
    我看软件工程师的职业规划
  • 原文地址:https://www.cnblogs.com/Kong-Ruo/p/9861018.html
Copyright © 2011-2022 走看看