Sample Input
3
2 5
3 2
2 1
3
3 3
4 4
5 5
0
Output for Sample Input
Case 1: 8
Case 2: 15
图片摘自:https://me.youkuaiyun.com/SunnyYoona
思路:贪心,什么交贪心呢?
贪心的思想就是局部得到最优解再推广到全局。
这个题我们首先要知道的一点是一定要让作战时间长的队员先执行,因为在他作战的时间里,还可以给别的队员进行讲述,这样就节省了时间
假设我们现在已经有了一个最优的时间T,那么我们判断第i个士兵的时候只要取max(T-sum[i-1],b[i]+j[i] ) (sum[i-1]表示前i-1个b之和,因为讲述的时间不能重合,也就是说不管怎样都讲述的时间之和都要包含在内,就看除了讲述之和的时间剩下的时间比不比要第i个士兵的讲述时间+作战时间大就行了,你要保证任务都执行完肯定要取一个大的。)
化简一下也就是比max (T,sum[i]+j[i] )
我说的太乱了,实在看不懂的话,就看代码吧
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef struct node{
int b,j;
}node;
bool cmp(const node &a,const node &b)
{
return a.j>b.j;
}
int main()
{
std::ios::sync_with_stdio(false);
node a[1005];
int n,i;
int cnt=1;
long long endtime,starttime;
while(cin>>n&&n)
{
endtime=starttime=0;
for(i=0;i<n;i++)
cin>>a[i].b>>a[i].j;
sort(a,a+n,cmp);
for(i=0;i<n;i++)
{
starttime+=a[i].b;
endtime=max(endtime,starttime+a[i].j);
}
cout<<"Case "<<cnt++<<": "<<endtime<<endl;
}
return 0;
}