题意:一个高级建筑师,设计一幢叠加式的楼,先建好每一层,每层有各自的重量w和抗压能力s,各层的PDV = 其上面所有楼层的重量和 - 该楼层的抗压能力,整幢楼的PDV为各楼层PDV的最大值,问各种不同的楼层叠加方式中这个PDV的最小可为多少。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4296
——>>开始时用的贪心策略是:w小的放上面,w 相等时,s小的放上面,结果WA了。后来才知道,贪心策略应是w+s小的放上面。
设sum为所有楼层的w之和,那么,对于最下面的楼层b,其PDV = sum - f[b].w - f[b].s = sum - (f[b].w + f[b].s);要使这层最小,那么 f[b].w + f[b].s应尽量大,对于从下面数上去的第二层,策略也是一样的……
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 10;
struct node
{
int w;
int s;
bool operator < (const node& e) const
{
return w + s < e.w + e.s;
}
}f[maxn];
int main()
{
int N, i;
while(~scanf("%d", &N))
{
for(i = 1; i <= N; i++) scanf("%d%d", &f[i].w, &f[i].s);
sort(f+1, f+N+1);
long long PDV = -1, temp, sum_w = 0;
f[0].w = 0;
for(i = 1; i <= N; i++)
{
sum_w += f[i-1].w;
temp = (sum_w-f[i].s) < 0 ? 0 : (sum_w-f[i].s);
PDV = max(PDV, temp);
}
printf("%I64d\n", PDV);
}
return 0;
}