POJ---3045(Cow Acrobats,贪心)

题意:

一坨牛往上叠,每头牛有两个属性:ws,分别代表自身重量和力量。一头牛的风险定义为:他头上的牛总重-他的力量。

确定一坨牛的排列顺序,使得这些牛的最大风险最低。

 

题解:

最小化最大值?二分走起?这道题没必要!常识也知道,重的,力量大的应该在下面。

不妨证明下:

                      A牛   :A牛头上有sum重量

                      B牛


假定现在为最优状态,对下面的牛:risk1=sum+w_a-s_b;

互换一下:

risk2=sum+w_b-s_a;

risk1<risk2;即w_b+s_b>w_a+s_a;

所以原先在下面的牛还是老实地待着吧。依次类推,上面每个牛都应该满足此条件,才能保证全体最优!

所以这道题就是赤裸裸的贪心,把牛按照w+s排序。然后从最上层的牛开始扫描每个的牛risk即可。扫描出最大的risk。就是题目答案。


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>


using namespace std;

struct node{int w,s,ss;};
struct node a[50005];
int sum[50005];
bool cmp(struct node x,struct node y)
{
    return x.ss<y.ss;
}

int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        //cin>>a[i].w>>a[i].s;再用cin可以剁手了
        scanf("%d%d",&a[i].w,&a[i].s);
        a[i].ss=a[i].w+a[i].s;
    }

    sort(a+1,a+n+1,cmp);

    int ans=-0x3f3f3f3f;
    for(int i=1;i<=n;i++)
    {
        sum[i]=sum[i-1]+a[i].w;
        ans=max(ans,sum[i-1]-a[i].s);
    }

    cout<<ans<<endl;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值