• 10.18 NOIP2018提高组模拟题(二)


    大水题

    1、咒语

    (curse.pas/c/cpp)

    【题目描述】

    亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路。正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条。
    亮亮拿起纸条的一端,只见上面写着打开机关的方法:“打开机关需要念动符咒,咒语是一串长为 L 的由 0 和 1 组成的字符串。在这张长纸条上列了 n 个长为 L 的字符串,正确的咒语即是在纷繁的 2^L 种字符串中,与这些纸条上的字符串相异度之和最小,并且在满足这一条件下, 0 的个数最多的字符串。两个字符串的相异度定义为对应位置不相等的字符对的个数。如‘011’和‘001’的相异度为 1,因为它们有且只有第二个位置上的字符不相等。”
    亮亮拉起纸条,只觉得纸条似乎永远也拉不完。这上面有着数以万计的字符串,而每一个字符串的长度也或百或千,以人力看来是无法得到正确的咒语。你能帮帮他,让他得以进入魔法城堡,一窥其中的奥秘吗?

    【输入格式】

    第一行为一个数字 N 。

    接下来的 N 行,每行为一个长为 L 的 01 字符串。数据保证 N 个字符串等长。

    【输出格式】

    只有一行,是一个长为 L 的字符串 S,即为正确的咒语。

    【样例输入】

    4
    01011
    01001
    01101
    10111
    

    【样例输出】

    01001
    

    【数据规模】

    对于 20%的数据, N<=5;

    对于 60%的数据, N<=100;

    对于 100%的数据, 1<=N<=1000, 1<=L<=1000。

    【题解】

    沙比题

    按位贪心

    2、神光

    (light.pas/c/cpp)

    【题目描述】

    亮亮成功地念出了咒语,石门缓缓地自动移开,一道道绚丽的神光从城堡内激射而出。亮亮好奇而又兴奋地走入了城堡中,迎面有一座极长的魔法阵。

    魔法阵可以看作一条直线,它被均匀地分成了 1 000 000 000 个位置,一个位置可以看成是一个格子。有些位置上筑有法坛,一共 N 座。亮亮只有破了眼前的魔法阵,才能继续前进,而欲破法阵,必须毁掉所有的法坛。

    亮亮身前有两根法杖:一根颜色血红,能发红色神光,光芒可以笼罩连续 L个位置,并摧毁这 L 个位置上所有的法坛,最多使用 R 次;另一根颜色碧绿,能发绿色神光,光芒可以笼罩连续 2L 个位置,并摧毁这 2L 个位置上所有的法坛,最多使用 G 次。

    法杖的神奇之处在于, L 的值必须由亮亮事先设定好,并且一经设定,便无法更改。亮亮需要在规定的次数下摧毁所有法坛,并且使得 L 最小。

    【输入格式】

    第一行三个整数 N, R, G。

    第 i (2<=i<=n+1) 行一个整数 Ai ,表示第 i 座法坛的位置。

    【输出格式】

    只有一个整数,表示 L 的最小值。

    【样例输入】

    3 1 1
    22
    17
    

    【样例输出】

    4
    

    【样例解释】

    亮亮将 L 设为 4,并用红色神光笼罩 21-24 位置,用绿色神光笼罩 1-8 位置。

    【数据规模】

    对于 50%的数据, N <= 100;

    对于 100%的数据, 1 <= N <= 2000, 1 <= R, G, Ai <= 1,000,000,000。

    【题解】

    显然L是有单调性,所以二分L转化为判定性问题

    把所有点排序

    由于坐标很大但是点的数量不大所以考虑下面的算法:

    设n1[i]表示以第i个点为左端点放红光,第一个没有被覆盖到的点

    n2[i]是放绿光的

    然后可以用单调指针求出这两个数组

    f[i][j]表示在序列左端用了i个红光和j个绿光第一个没被覆盖的点的编号

    注意到当r和g大于n时候答案一定是1

    所以下标开到n即可

    f[i][j]=max{n1[f[i-1][j]],n2[f[i][j-1]]}

    注意i=0和j=0的情况特殊处理一下即可

    3、迷宫

    (maze.pas/c/cpp)

    【题目描述】

    破了魔法阵后,亮亮进入了一座迷宫。这座迷宫叫做“梦境迷宫”,亮亮只有走出这座迷宫,才能从睡梦中醒来。

    梦境迷宫可以用无向图来表示。它共有 n 个点和 m 条双向道路,每条道路都有边权,表示通过这条道路所需的时间,且每条道路可以多次经过。亮亮位于一号点,而出口则是 n 号点。原本,亮亮该找到一条最短路,快速冲出迷宫,然而,梦境迷宫的特殊之处在于,如果沿着最短路到达出口,亮亮就会永远陷入梦境。因此,亮亮必须寻找一条次短路。次短路的长度须严格大于最短路(可以有多条)的长度,同时又不大于所有除最短路外的道路的长度。

    你的任务,就是编写一个程序,帮助亮亮找到通向出口的次短路。

    【输入格式】

    第一行有两个整数 n、 m,表示迷宫内共有 n 个点, m 条边。

    接下来 m 行,每行三个整数 x、 y、 z,表示结点 x 和 y 之间连有一条边权为z 的无向边。

    【输出格式】

    一个整数,表示次短路的长度。

    【样例输入】

    4 4
    1 2 2
    2 4 4
    2 3 3
    3 4 4
    

    【样例输出】

    9
    

    【样例解释】

    最短路: 1 -> 2 -> 4 (长度为 2+4=6)

    次短路: 1 -> 2 -> 3 -> 4 (长度为 2+3+4=9)

    【数据规模】

    对于 100%的数据, 1 <= n <= 5000, 1 <= m <= 100,000。

    对于 100%的数据, 1 <= z <= 5000, z 表示无向边的边长。

    【题解】

    可以先dij一下求从1到所有点的最短路d

    然后一个点的次短路可以通过其它点的最短路更新来,也可以通过其它点的次短路更新来

    然而它更新了之后还可能取更新其它点

    所以用类似spfa,先把所有点扔到一个队列,然后取出点更新其它点的次短路即可。

  • 相关阅读:
    一个完整的AjaxPro例子(转)
    sql2000存储过程
    System.Configuration命名空间下找不到ConfigurationManager类
    编译器错误信息: CS0016
    (转)AjaxPro使用说明
    数据库中去逗号的函数
    asp.net 验证码
    sql2005存储过程
    简单控件分页
    身份证号码验证
  • 原文地址:https://www.cnblogs.com/oier/p/9809303.html
Copyright © 2020-2023  润新知