uva 11729(贪心)

若采用部署时间从长到短的顺序排序的话,由于完成任务的时间不确定,不能保证前一完成/部署的时间与下一部署时间重叠时间最大。因此采用完成时间从长到短的顺序排序。

输入包含多组数据,每组数据的第一行为部下的个数n(1<=n<=1000);以下n行,每行两个正整数B和J(1<=B<=10000,1<=J<=10000),即交待任务的时间和执行任务的时间。输入结束标志为n=0。
Output

对组每组数据,输出所有任务完成的最短时间。具体输出格式见样例,用Case开头,Case以后输出当前数据的序号,然后输出答案。
Sample Input
3
2 5
3 2
2 1
3
3 3
4 4
5 5
0
Sample Output
Case 1: 8
Case 2: 15

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;

struct job{
    int j,b;
    bool operator <(const job& x)const{
    return j >x.j;
    }
};

int main(){
    int n,b,j,kase = 1;//n个人,b的时间交代任务,j的时间完成任务
    while(scanf("%d",&n) && n != 0){
        vector<job> v;//一个个体有多个变量并需要以某一变量进行分析,排序时可创造一结构体,配合vector进行排序
        for(int i = 0;i < n;i ++){
            scanf("%d%d",&b,&j);v.push_back((job){j,b});
        }
    sort(v.begin(),v.end());
    int s = 0;
    int ans = 0;
    for(int i = 0;i < n;i++){
        s+=v[i].b;
        ans = max(ans,s+v[i].j);//若在下一个人完成任务之后,上一个人还没有完成任务,那总长自然是算上一个人完成任务的时间;反之亦然。
    }
    printf("case %d:%d\n",kase++,ans);
    }

}


/*一开始错误的想法
{
    int N;
    int TELL[maxn],DO[maxn];
    while(cin >> N &&N != 0)
    {
        for(int i = 0;i < N;i++){{scanf("%d%d,&Tell[i],&DO[i]);}
    }
}*/
上一篇:UVA 11468 Substring (记忆化搜索 + AC自动鸡)


下一篇:UVA - 10883 Supermean