POJ 3045 Cow Acrobats

传送门:http://poj.org/problem?id=3045

题意:
给你一些牛,每个牛有weight,和strength两个属性,你可以按照一定的顺序将它们排成一列,每一头牛都有一个风险指数=它们前面所有牛的重量-它的strength,求风险指数最大的牛其风险指数的最小值。
解题思路:
本题最重要是找到一个最优的排列,

不妨设牛已经按照最优的方式排成一列:
设w=w1+w2+....+wi-1  
第i头牛的风险指数:w-si   ①
第i+1头牛的风险指数: w+wi-si+1   ②

现在交换两头牛那么:
i+1头牛的风险指数(现在的第i头牛):w-si+1   ③
i头牛的风险指数(现在的第i+1头牛):w+wi+1-si  ④

很明显: ①<④, ③<②,而我们假设原来是最优的,而交换后肯定不是最优的,那么就有:②<④,即wi+si<wi+1+si+1,
那么本题的解法就是根据wi+si排序就成了。
实现代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

const int MAXN=50000;
const int INF=1<<30;

struct Node{
    int w,s;
    bool operator <(const Node &rhs) const{
        return w+s<rhs.w+rhs.s;
    }
}cow[MAXN];


int main(){
    int N;
    cin>>N;
    for(int i=0;i<N;i++){
        scanf("%d%d",&cow[i].w,&cow[i].s);
    }
    sort(cow,cow+N);
    int Max=-INF;
    int sum=0;
    for(int i=0;i<N;i++){
        Max=max(Max,sum-cow[i].s);
        sum+=cow[i].w;
    }
    cout<<Max<<endl;
    return 0;
}

 

posted on 2017-04-11 17:30  mkfoy  阅读(221)  评论(0编辑  收藏  举报

导航