您的位置:首页 > 其它

POJ 3045 Cow Acrobats

2014-09-18 22:24 274 查看

http://poj.org/problem?id=3045

题意:

N头牛叠罗汉,每头牛有个体重Wi,力气Si.一头牛要承担的风险为所有在它上面的牛的体重之和-它的力气。求一个方案使得风险最大的牛的风险值最小。

分析:

对于相邻的两头牛,它们交换位置不影响其他的任何牛,只改变这两头牛的风险值。记sum为这两头牛上面的牛的体重总和.i在j上面

Risk i=sum-si

Risk j=sum+wi-sj

交换位置之后

Risk i'=sum+wj-si

Risk j'=sum-sj

而方案1优于方案2,则max{Riski,Riskj} < max{Riski',Riskj'}

而Risk j >Risk j'

所以 Risk i' > max{Riski,Riskj}, 且Risk i' >Risk j'。

解之会得到:

wj + sj > wi + si 即w + s大的放在下面的方案是最优的。

AC_CODE:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;

int N,ans,sum[50010];

struct cow{
    int u,v;
    bool operator < (const cow &x) const{
        return u+v < x.u + x.v;
    }
}node[50010];

int main(){
//    freopen("in.txt", "r", stdin);
    while(scanf("%d",&N) != EOF){
        memset(sum, 0, sizeof(sum));
        for(int i=1; i<=N; i++)
            scanf("%d%d",&node[i].u,&node[i].v);
        sort(node + 1, node + 1 + N);
        int ans = -0x3f3f3f3f;
        for(int i=1; i<=N; i++){
            sum[i] = sum[i - 1] + node[i].u;
            ans = max(ans, sum[i - 1] - node[i].v);
        }
        printf("%d\n",ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: