HDU 4296 building
题意:
给出 n 个木板的重量值和长度 然后每个木板的PDV = 压在他上面的木板的重量值之和-该木板的长度值
求所有木板中PDV值最大的最小
给出一个 n 表示木板的数量
接下来 n 行表示每块木板的重量值和长度值
求PDV最大的最小
分析:
①如果排序为 a b 则a的PDV = sum-wb b的PDV = sum+wa-sb
②如果排序为 b a 则b的PDV = sum-sb a的PDV = sum+wb-sa
要想第一种方法要想最大值的PDV < 第二种方法最大值
则 wa+sa < wb+sb
所以排序然后找这种最优方法中的最大值
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct node { int w,s; }q[100005]; int cmp(node a,node b) { return a.w+a.s<b.w+b.s; } int main() { int i,n; __int64 ans; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d%d",&q[i].w,&q[i].s); sort(q,q+n,cmp); ans=0; __int64 sum=0; sum+=q[0].w; for(i=1;i<n;i++) { if(sum-q[i].s>ans) ans=sum-q[i].s; sum+=q[i].w; } printf("%I64d\n",ans); } return 0; }