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

posted @ 2016-04-13 19:39  GerynOhenz  阅读(424)  评论(0编辑  收藏  举报