zoukankan      html  css  js  c++  java
  • uva 11300 Spreading the Wealth_数学推倒 + 思维

    这道题和负载平衡问题是同一道题, 如果 $n <= 100$ 的话是可以用最小费用流来求解的。
    但是题中 $n$ 最大可达到 $10^6$, 这就需要我们进行一些性质分析与推导。
    首先, 我们设每个·人手里最终金币数为 $C$
    设 $X_{i}$ 为第 $i$个人给第 $i+1$ 个人的金币数目, 这个数目可以为负(第$i + 1$ 个人向左给了第$i$ 个人$|X_{i}|$个。
    则我们不难发现:
    1. $A_{2}+X_{1}-X_{2}=C$
    2. $A_{3}+X_{2}-X_{3}=C$
    3. $A_{4}+X_{3}-X_{4}=C$
    4. ...
    5. $A_{i}+X_{i-1}-X_{i}=C$
    而这道题要求的其实就是$min|X_{1}| + |X_{2}| + |X_{3}| + |X_{4}| +... |X_{n}|$
    那么,我们可将上面的等式进行变形,得:
    1. $X_{1} = X_{1}$
    2. $X_{2} =A_{2}-C+X_{1}$
    3. $X_{3} =A_{2} + A_{3}-2*C+X_{1}$
    4. $X_{4} =A_{2} + A_{3} +A_{4}-3*C+X_{1}$
    5. $X_{5} =A_{2}+A_{3}+A_{4}+A_{5}-4*C+X_{1}$
    此时,相信聪明的读者们不难发现规律:
    $X_{i} = sumlimits_{k=2}^i-(i-1)*C+X_{1}$ 即 $X_{i} = sumlimits_{k=2}^i-(i-1)*C-(-X_{1})$
    我们可以把$X_{1}$抽象成数轴上的一个点, 我们设$g_{i}= sumlimits_{k=2}^i-(i-1)*C$,那么我们希望 $X_{1}$ 到所有 $g_{i}$ 的距离和最短,这个 $X_{i}$ 一定是 $g_{i}$中的中位数,于是我们将所有的 $g_{i}$ 排序,取中位数作为 $X_{1}$ 即可,我们也就能顺便推出所有的 $X_{i}$ ,最后加和即可,总时间复杂度为 $O(nlogn)$

  • 相关阅读:
    用户模板和用户场景
    移动端疫情展示
    数据爬取
    全国疫情统计可视化地图-第二、三阶段
    学习进度条-第三周
    学习进度条-第二周
    软件工程第二周开课博客
    返回一个整数数组中最大子数组的和
    JavaWeb选课系统(2)
    JavaWeb选课系统
  • 原文地址:https://www.cnblogs.com/guangheli/p/9845117.html
Copyright © 2011-2022 走看看