算法入门经典训练指南打卡
题目链接:UVa 11729
思路
如图:
由图可知:总时间的长短跟重叠部分有关。而重叠部分则是前一次交待任务的执行时间
因此,只需要按照执行时间从长到短交待即可
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std ;
struct Jobs{
int b ;
int j ;
};
bool cmp(Jobs a , Jobs b){
return a.j > b.j ;
}
int main(){
Jobs x ;
int n , kase = 1 ;
while (scanf("%d" , &n) == 1 && n){
vector<Jobs> sub ;
for(int i = 0 ; i < n ; ++ i){
scanf("%d %d" , &x.b , &x.j) ;
sub.push_back(x) ;
}
sort(sub.begin() , sub.end() , cmp) ; //使用sort序将执行时间长的任务排在前面
int begin = 0 , ans = 0 ;
for(auto i : sub){
begin += i.b ; //记录当前任务开始的时间
ans = max(ans , begin + i.j) ; //更新当前任务完成时总共用的时间
}
cout << "Case " << kase ++ << ": " << ans << endl ;
}
return 0 ;
}