您的位置:首页 > 其它

POJ3045 Cow Acrobats 贪心

2017-11-19 20:48 225 查看
很好的一道贪心练手题。

题目大意

给出n头牛的体重w[i]和力量值s[i],然后要将他们在竖直方向上叠放在一起,每头牛的risk值是它头顶所有牛体重和减去它的力量值,求所有叠放次序中,牛的最大risk值的最小值。

题解

贪心的思路很简单。答案就是将牛按照w[i]+s[i]排序,w[i]+s[i]大的牛叠在下面。

下面证明这个结论:

考虑相邻的两头牛i和i+1, i+1叠在i的下方, 如果w[i+1]+s[i+1] < w[i]+s[i];

设i上方牛的总重量为w0,那么有r[i] = w0 - s[i]; r[i+1] = w0 + w[i] - s[i+1] (r表示risk值)

如果我们将i和i+1互换,那么有r’[i] = w0 + w[i+1] - s[i]; r’[i+1] = w0 - s[i+1]

即r[i]变大了,r[i+1]变小了。

我们来比较下r[i+1]和r’[i]的大小:

r’[i] - r[i+1] = w[i+1] +s[i+1] - w[i] - s[i] < 0

即r[i+1] > r’[i] >= r[i]

所以max{r[i], r[i+1]} = r[i+1]

因为r[i+1] > r’[i], 且r[i+1] >= r’[i+1]

所以r[i+1] = max{r[i], r[i+1]} >= max{r’[i], r’[i+1]}

所以max{r[j] for all j} >=max{r’[j] for all j}

即,在i和i+1逆序的情况下,我们交换i和i+1,会得到同样优或者的结果。

这样经过若干次交换操作后,就得到一个升序序列,就是最后的答案。

源代码

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: