洛谷 1842 [USACO05NOV]奶牛玩杂技【贪心】
【题意】
有N只奶牛,要摞在一起。
每只奶牛有重量wi和体力值si
每只奶牛的压扁值为它上面的奶牛的重量w之和-它自己的体力值si
使最大的压扁值最小。
【题解】
贪心,构造排序的compare函数即可。
假设有两只相邻的奶牛i和j,
i在j上的总压扁值是 max( a+Wi-Sj, a-Si), 其中a是他们上面的奶牛的质量。
j在i上的总压扁值是 max( a+Wj-Si, a-Sj).
比较这两个值的大小来决定i, j的上下关系即可。
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long #define N 500010 using namespace std; int n; LL ans=-2e9,sum; struct rec{ int w,s; }a[N]; inline int read(){ int k=0,f=1; char c=getchar(); while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); return k*f; } inline bool cmp(rec x,rec y){ int xabove=max(x.w-y.s,-x.s); int yabove=max(y.w-x.s,-y.s); return xabove<yabove; } int main(){ n=read(); for(int i=0;i<n;i++) a[i].w=read(), a[i].s=read(); sort(a,a+n,cmp); for(int i=0;i<n;i++){ ans=max(ans, sum-a[i].s); sum+=a[i].w; } printf("%lld\n",ans); return 0; }