传送门: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; }