Commando War(贪心)

题目

或许每个人都有成为将军的梦想,小光也是如此。从小,小光就立志长大了以后要做一名军人,保家卫国。有一天,他做了一个梦,在梦里,他是一个英明神武的将军,但是敌国马上就要入侵了,作为将军的他责无旁贷需要挺身而出,于是他开始做一些战略部署。

假设当前小光有n个部下,每个部下需要完成一项任务。第i个部下需要小光花Bi分钟交代任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。小光需要选择交代任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务应尽早结束)。注意,不能同时给两个部下交代任务,但部下们可以同时执行他们各自的任务。

Input

输入包含多组数据,每组数据的第一行为部下的个数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<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
#include<queue>
#include<stack>
using namespace std;
struct xx
{
    int a;
    int b;
} ss[11000];
bool cmp(xx x,xx y)
{
    if(x.b==y.b)
        return x.a<x.b;
    return x.b>y.b;
}
int main()
{
    int n;
    int k=0;
    while(~scanf("%d",&n))
    {
        if(n==0)
            break;
        memset(ss,0,sizeof(ss));
        for(int i=0; i<n; i++)
        {
            scanf("%d %d",&ss[i].a,&ss[i].b);
        }
        sort(ss,ss+n,cmp);
        int ans=ss[0].a;
        int a1=ss[0].a,b1=ss[0].b;
        int now=ans;
        for(int i=1; i<n; i++)
        {
            a1=ss[i].a;
            if(now+b1<=ans+a1+ss[i].b)
            {
                now=ans+a1;
                b1=ss[i].b;
            }
            ans=ans+a1;
        }
        ans=now+b1;
        k++;
        printf("Case %d: %d\n",k,ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43372531/article/details/84638682
war