您的位置:首页 > 其它

POJ 3045 Cow Acrobats (最大化最小值)

2015-06-04 12:04 495 查看
题目链接click here~~

【题目大意】

给你n头牛叠罗汉,每头都有自己的重量w和力量s,承受的风险数rank就是该牛上面所有牛的总重量减去该牛自身的力量,题目要求设计一个方案使得所有牛里面风险最大的要最小。

【解题思路】:按照w+s贪心放置,越大的(注意是w+s之和)越在下面。不难证明:如果最优放置时,相邻两头牛属性分别为w1,s1,w2,s2,第一头牛在第二头上面,sum为第一头牛上面的牛的体重之和,那么第一头牛风险:rank1=sum-s1;第二头牛风险:rank2=sum+w1-s2;交换两头牛位置之后 rank1'=sum+w2-s1,rank2'=sum-s2,由于是最优放置,所以w2-s1>=w1-s2,即w2+s2>=w1+s1,所以和最大的一定在最下面!因此排序,判断即可!

代码:

//#include <bits/stdc++.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e6+10;
long long  num
;
long long  n,m,k;
struct node
{
    long long  sum ,w,s;
} pp
;
bool cmp(node a,node b)
{
    return a.w+a.s<b.w+b.s;//坑啊!!!
}
int main()
{
    //freopen("1.txt","r",stdin);
    scanf("%lld",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%lld%lld",&pp[i].w,&pp[i].s);
    }
    sort(pp,pp+n+1,cmp);
    pp[1].sum=0;
    for(int i=2; i<=n; i++)
    {
        pp[i].sum=pp[i-1].sum+pp[i-1].w;
    }
    long long maxx=-1e10;
    for(int i=1; i<=n; i++)
    {
        maxx=max(pp[i].sum-pp[i].s,maxx);
    }
    printf("%lld\n",maxx);
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: