zoukankan      html  css  js  c++  java
  • NOI2012 Day2

    NOI2012 Day2

    迷失游乐园

    题目描述:给出一个(n)个点的图,边数为(n-1)(n)。从某个点出发,每次等概率地随机选一个相连的并且没有经过过的点,直到不能走为止,问期望路径长度为多少。(开始时等概率选一个点为起点)

    solution:
    设期望长度为(Len),每个点的度为(d),则

    [Len[i]=sum_{j与i相连} frac{Len[j]+dis[i][j]}{d[i]} ]

    如果是一棵树,那么可以记(f[i])为从(i)号的祖先走到(i)号点往下走的期望长度,(g[i])为从(i)号点的子树走到(i)号点往上走的期望长度。

    [f[i]=sum_{j in son(i)} frac{f[j]+dis[i][j]}{d[i]-1} ]

    $$g[i]=frac{g[fa(i)]+f[fa(i)]-frac{f[i]+dis[i][j]}{d[fa(i)]-1}+dis[i][j]}{d[i]-1}$$

    [ans=sum_{i=1}^{n} frac{(f[i]+g[i])*(d[i]-1)}{d[i]} ]

    其中,在计算(g)的时候要计算出它的父亲不进入该子树的期望长度,所以式子有点长。
    如果有一个环,那么先把环找出来,对于环上的每个点的树都按上面的算出(f)(g)不能在像上面这样先算,因为只有一棵树时,根是无法向上走的,但现在根可以走到环上的其它点的树,所以要先把环上的点的(g)算出来。
    枚举环上的点(i),然后枚举顺逆时针(这样就相当于删去环上的一条边),这就变成了一棵以(i)为根的一棵树,求从(i)往下走的期望长度(类似于(f))。求出环上的点的(g)后,就可以像上面一样处理环上的每一点的树。

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

    美食节

    题目描述:有(n)种菜品,每种菜品有(p[i])个学生预订,共有(m)个厨师制作这(n)种菜,厨师按要求的顺序制作,每次做一人份,每个厨师制作同一道菜的时间未必相同每个同学的等待时间为所有厨师开始做菜起,到自己那份菜品完成为止,求学生最短总等待时间。

    solution
    这题主要在于能否逆向思考问题,如果卡在顺序上,那么就解不出这道题了。我们应该考虑每道菜的贡献。设一位厨师一共制作(k)道菜,那么第一道菜对时间的贡献为(做菜时间$ * k(),第二道菜为)(k-1)$,最后一道为(1),所以可以求厨师的最后一道菜是什么?倒数第二道才是什么?……以此来构图(最小费用网络流)
    可以采用动态加点,首先每位厨师做一道菜(最后一道),哪位厨师做满了,就加点连向这位厨师与对应的菜品,这时新加的边的费用为((*2)),以此类推,直到完成任务为止。

    时间复杂度:(?)

  • 相关阅读:
    配置HDFS HttpFS和WebHDFS
    编译hbase-1.2.3源代码
    Yarn application has already exited with state FINISHED
    一种基于Redis的10行代码实现IP频率控制方法
    PRId64的正确用法
    cmake检测g++编译器是否支持c++11
    定时取指定进程内存脚本
    C++常见gcc编译链接错误解决方法
    Congestion Avoidance in TCP
    Studying TCP's Throughput and Goodput using NS
  • 原文地址:https://www.cnblogs.com/GerynOhenz/p/4708201.html
Copyright © 2011-2022 走看看