zoukankan      html  css  js  c++  java
  • USACO2016 January Gold Angry Cows

    Angry Cows

    题目描述:给出数轴上的(n)个整点((a[i])),现在要在数轴上选一个位置(x)(可以是实数),以及一个半径(R),在以(x)为中心,半径为(R)的范围内的点为被覆盖,然后被覆盖的点会以自己为中心,半径为(R-1)覆盖其它未被覆盖的点,以此类推,问覆盖所有点的最小(R)

    solution
    这道题挺好的,可能我对于那些有单调性的题目不是很熟悉吧。
    从小到大排序,首先算出以(i)为半径中心,覆盖前(i)个点的最小半径(f[i]),容易得出(f[i])是递增的。假设半径最左要覆盖到(j),那么(f[i]=max(f[j]+1, a[i]-a[j])),假设还有一个决策(k, k>j),因为(f)是递增的,当(f[j]+1>=a[i]-a[j])时,(j)要比(k)优。当(f[j]+1<a[i]-a[j])时,对于之后的(i)(j)的值固定不变,若(k)的值比(j)小,则(j)以后的不会成为最优决策了。所以最优决策时单调的。(f)可以线性解出。
    类似的,(g[i])表示覆盖(i)后的点的最小半径。然后二分答案,枚举第一次爆炸的左边界,因为(R)一定,右边界单调,判断是否有解即可。

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

  • 相关阅读:
    Nulls first和nulls last
    json.parse()和json.stringify()
    将单个的.java文件通过javac编辑为.class文件
    看别人项目思路:
    我想成为怎样的人?
    装逼语录:
    Uncompressing Linux... done, booting the kernel
    linux 内核模块最小环境编译
    select 定时器
    mount
  • 原文地址:https://www.cnblogs.com/GerynOhenz/p/5388491.html
Copyright © 2011-2022 走看看