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))

原文地址:https://www.cnblogs.com/GerynOhenz/p/5388491.html