洛谷 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;
}

  

posted @ 2020-06-15 21:48  Driver_Lao  阅读(165)  评论(0编辑  收藏  举报