zoukankan      html  css  js  c++  java
  • 集训Day 4 2020.3.3 杂题选讲(一)

    集训Day 4 2020.3.3

    杂题选讲

    1.课后练习讲解

    1.JSK42190

    https://nanti.jisuanke.com/t/41290

    给定大小为N的带点权,带边权的完全图, (N<200)。 然后(Q)次询问,每次给出((u,v,w)), 让你求在除了起点终点的其他途经点的点 权都(le w) 的条件下的最短路。

    题解

    (operatorname{Floyd})的循环顺序

    [k_{i,j},f_{i,j}=min (f_{i,j},f_{i,k}+f_{k,j}) ]

    将每个点按照点权排序,然后每次询问按照点权排序,根据询问的(w)加入比(w)小的点和与该点所有的边,同时跑(operatorname{Floyd})
    实际上你只需要对(k)那层做点手脚就好了,正确性就是(operatorname{Floyd})的正确性,复杂度(O(n^3))

    2.JSK41288

    https://nanti.jisuanke.com/t/41288

    一共有(n)个人要上飞机,这班飞机有(n)个座位,第(i)个人的座位号是(i)
    现在(n)个人按照座位号是从(1)(n)的顺序上飞机,但(1)号随机选了一个位置坐下了,而其余人都记得自己的位置,如果他们中的一个人上飞机之后发现自己的位置被占了,则会在剩下的位置中等概率随机选一个坐下,如果没被占,则会直接坐到自己的位置上。
    你需要计算最后一个上飞机的人坐到了自己位置上的概率。

    题解

    不难发现,(n=1)时答案为1,(nge 2)时全是0.5
    (f_i)为飞机上一共有(i)个人时候的答案
    当1坐在1号位,则剩下的人肯定能坐在自己的位置上,此时概率为1
    当1坐在第k号位,那么第2~(k-1)个人可以坐在自己的位置上,轮到第(k)个人时会开始随机坐,那么我们不妨将第(k)个人视为1,将剩余的(n-k)个空位,视为新的(n),以此类推,这样递推关系就很清晰了:

    [f_n=dfrac{1+f_2+f_3+...+f_{n-1}}{n} ]

    不难证明(nge 2)时恒为0.5

    3.JSK41288-2

    https://nanti.jisuanke.com/t/41288

    还有一问:返程的时候,有(m)个人会按照一个随机的座位号上飞机。
    这班飞机有(m)个座位,还是(1)号随机选了一个位置坐下了,而其余人都记得自己的位置。现在所有人找座位的规则和出发时完全相同,任何一个发现自己座位已经被占了的人会等概率随机选一个没被占的座位坐下。
    你需要计算最后一个上飞机的人坐到了自己位置上的概率。

    题解

    根据第一问:
    如果1第1个上飞机,那么问题就转化为(f_m)
    如果1第2个上飞机,因为第一个人肯定坐在了自己的位置上,那么也就是(f_{m-1})
    如果1第3个上飞机,因为前两个人肯定坐在了自己的位置上,那么就是求(f_{m-2})
    ...
    如果1第(k)个上飞机,因为前(k-1)个人肯定坐在了自己的座位上,那么就是求(f_{m-k+1})
    如果1最后一个上飞机,那么概率肯定是1

    有趣的是,除了(f_1)都是0.5,于是可以直接变成:
    如果1不是最后一个上飞机,概率为0.5,而第一种情况为(dfrac{1}{m}),第二种为(dfrac{m-1}{m})
    答案就是(dfrac{1}{m} imes 1+dfrac{m-1}{m} imes dfrac{1}{2}=dfrac{m+1}{2m})

    卡特兰数

    【定义见Day 3】

    例题 LGP1044 栈

    宁宁考虑的是这样一个问题:一个操作数序列,(1,2,...,n),栈(A)的深度大于(n)
    现在可以进行两种操作,
    将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的(push)操作)
    将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的(pop)操作)
    你的程序将对给定的(n),计算并输出由操作数序列(1,2,…,n)经过操作可能得到的输出序列的总数。

    题解

    (f_x)为进出(x)个数的序列的总数目,显然(f_0=f_1=1)
    我们思考,对于第(x)个数,假设它正好是最后一位输出的,那么在它之前入栈出栈的就有(x-1)个数,然后再把(x)入栈,然后再入栈出栈(n-x)个数,最后把(x)出栈,所以此时进出(x)个数的序列的总数目为(f_{x-1}f_{n-x})
    因为(x)可以取值(1)~(n),所以其实答案就是把它们累加起来,于是最终答案就是卡特兰数第(n)项了。

    思考
    不难发现,其实方案数实际等于入栈出栈的方案数,于是我们可以将问题转换为:
    1为入栈,0为出栈,在合法的情况下入栈(n)次,求入栈出栈序列数。
    答案就是卡特兰数第(n)项。

    2.P1754 球迷购票问题

    每位购票者限购一张门票,且每张票售价 为50元。在排成长龙的球迷中有N个人手持 面值50元的钱币,另有N个人手持面值100 元的钱币。假设售票处在开始售票时没有 零钱。试问这2N个球迷有多少种排队方式 可使售票处不致出现找不出钱的尴尬局面。

    一些经典递推

    1.

    给一个凸n边形,要求连接(n-3)条对 角线,划分(n-2)个三角形,求方案数。

    题解

    我们先给凸(n)边形的顶点编号,假设先连两条线构造一个三角形(V_1V_nV_x),这样我们其实就把这个凸(n)边形分成了一个三角形,一个(k)边形,一个(n-k)边形……
    和栈那道题是不是已经很像了?
    这也是卡特兰数的起源,是欧拉发现的 (怎么还是欧拉

    2.

    抛一枚硬币,如果是反面就继续抛,问抛 出正面的期望次数。
    (期望话可以理解为概率( imes)代价, 比如说小A投球中的概率为(dfrac{1}{3}),那么投三 个球中的期望就是(dfrac{1}{3} imes 3=1)

    题解

    (x=1+dfrac{1}{2} imes 0+dfrac{1}{2} imes x)发现递归下去了。
    解这类方程其实需要运用极限的思想,但 是一种简单的解法是直接移项整理解出x=2 即可
    这个期望dp最好的例子

    附上我的证明
    (C_i=a_ib_i,a_i=i,b_i=left( dfrac{1}{2} ight)^i),则:

    [S=sum C_i=sum a_ib_i=1 imesleft( dfrac{1}{2} ight)+2 imes left( dfrac{1}{2} ight)^2+...+nleft( dfrac{1}{2} ight)^n ]

    [dfrac{1}{2}S=1 imesleft( dfrac{1}{2} ight)^2+2 imes left( dfrac{1}{2} ight)^3+...+nleft( dfrac{1}{2} ight)^{n+1} ]

    [T=S-dfrac{1}{2}S=1 imes left( dfrac{1}{2} ight)+left( dfrac{1}{2} ight)^2+left( dfrac{1}{2} ight)^3+...+left( dfrac{1}{2} ight)^n-nleft( dfrac{1}{2} ight)^{n+1} ]

    [T=S-dfrac{1}{2}S=(left( dfrac{1}{2} ight)+left( dfrac{1}{2} ight)^2+left( dfrac{1}{2} ight)^3+...+left( dfrac{1}{2} ight)^n)-nleft( dfrac{1}{2} ight)^{n+1} ]

    [M=left( dfrac{1}{2} ight)+left( dfrac{1}{2} ight)^2+left( dfrac{1}{2} ight)^3+...+left( dfrac{1}{2} ight)^n=1-left( dfrac{1}{2} ight)^{n} ]

    [T=S-dfrac{1}{2}S=M-dfrac{n}{2}left( dfrac{1}{2} ight)^{n}=1-left(dfrac{n}{2}+1 ight)left( dfrac{1}{2} ight)^{n} ]

    [S=2-left(n+2 ight)left( dfrac{1}{2} ight)^{n} ]

    3.JSK43375

    https://nanti.jisuanke.com/t/43375

    从上往下摞(n(nle 60))个字母(字母只有Z与 O),然后进行操作
    从下往上找到第一个O,把它变成Z,把它下面的Z变成O
    问多少次操作之后可以全部变成Z

    题解

    这个操作多少让人想起了二进制,事实也 是如此。 把塔放倒,Z视作0,O为1,求二进制。

    课后练习

    LGP1309 瑞士轮

    (2N)名编号为(1)~(2N)的选手共进行(R)轮比赛。每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到底对选手进行一次排名。选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。总分相同的,约定编号较小的选手排名靠前。
    每轮比赛的对阵安排与该轮比赛开始前的排名有关:第1名和第2名、第 3名和第 4名、……、第(2K−1)名和第(2K)名、…… 、第(2N-1)名和第(2N)名,各进行一场比赛。每场比赛胜者得(1)分,负者得 (0)分。也就是说除了首轮以外,其它轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现。
    现给定每个选手的初始分数及其实力值,试计算在(R)轮比赛过后,排名第(Q)的选手编号是多少。我们假设选手的实力值两两不同,且每场比赛中实力值较高的总能获胜。
    对于(100\%)的数据,(1 ≤ N ≤ 100,000,1 ≤ R ≤ 50,1 ≤ Q ≤ 2N,0 ≤ s_1, s_2, …, s_{2N}≤10^8)
    (1 ≤w_1,w_2,...,w_{2N}le 10^8)

    题解

    归并排序模板题?模拟?
    我不说啥了...
    把sort改成归并,就过了吧...

    要做就做南波万
  • 相关阅读:
    cdn服务器
    面向对象---特----性
    我自己总结的一些知识点--分享
    进程与线程的区别
    centos忘记root用户的密码
    svn上传时显示database is locked
    公司memcache安装方式及启动方式
    阿里云挂载快照盘
    阿里云卸载磁盘是报错
    scp
  • 原文地址:https://www.cnblogs.com/liuziwen0224/p/xjx4.html
Copyright © 2011-2022 走看看