1018: 突击战
时间限制: 1 Sec 内存限制: 128 MB
提交: 1358 解决: 523
[提交][状态][讨论版]
题目描述
你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交待任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交代任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完成的任务应尽早结束)。注意,不能同时给两个部下交待任务,但部下们可以同时执行他们各自的任务。
输入
输入包含多组数据,每组数据的第一行为部下的个数N(1<=N<=10000);以下N行每行两个正整数B和J(1<=B<=10 000,1<=J<=10 000),即交待任务的时间和执行任务的时间。输入结束的标志为N=0。
输出
对于每组数据,先输出“Case #: ”(‘#’表示第几组数据),然后是所有任务完成的最短时间。
样例输入
3 2 5 3 2 2 1 3 3 3 4 4 5 5 0
样例输出
Case 1: 8 Case 2: 15
提示
对于Sample里的第一组数据,你给部下交待任务的顺序应该是1,2,3得到最早的完成时间是8;
第二组数据,你给部下交待任务的顺序应该是3,2,1得到最早的完成时间是15。
来源
解析:首先花费的时间肯定要大于交代任务的时间总和,所以我们要排序的其实只要看完成任务的时间,从大到小排序,先做完成任务比较长的,编个序号为123吧,完成第一个任务所需要的时间最小为布置+完成的时间,完成第一个和第二个任务所需要的时间:需要比较布置第一个任务所需要的时间+第二个任务布置的时间和完成的时间的和是否大于完成第一个任务所需要的最小时间,如果大于:完成两个任务的最小时间就要变成两个任务布置的时间+第二个任务完成的时间
否则:完成两个任务的最小时间=完成第一个任务的最小时间
以此类推
下面上代码
#include<bitsdc++.h>
using namespace std;
struct h{
int b,j;
}a[10001];
int down(h x,h y){
return x.j>y.j;//因为最后的总时间一定是包含a[i].b的,所以要安排a[i].j的顺序
}
int main()
{
int n,ca=1;
while(cin>>n&&n){
int c[n];
for(int i=0;i<n;i++){
cin>>a[i].b>>a[i].j;
}
sort(a,a+n,down);//排序
int ans=0,sum=0;//ans为a[i].b的和,sum为最短时间
for(int i=0;i<n;i++){
ans+=a[i].b;
if(ans+a[i].j>sum) sum=ans+a[i].j;//如果ans+a[i].j>sum的话,最短时间要改变
}
cout<<"Case "<<ca<<": "<<sum<<endl;
ca++;
}
return 0;
}