UVA 11729 Commando War

题意:给你N个士兵,队长分别给每个士兵一个任务,每个士兵有不同的任务并且互不干扰,每个士兵有两个变量,第一个变量为队长交代任务的时间,第二个变量为当前士兵要完成任务的时间,问:当最后一个士兵完成任务的时候,时间最短为多少、 你可以安排队长给士兵安排任务的先后、

思路:一道贪心题,首先要排序,将士兵完成任务的时间排序,因为如果这个士兵完成的时间大于第二个士兵交代的时间,那么我便相当于他们两个的时间重合,便可以将重合的时间不计入总时间内,因为士兵的任务是互不干扰的、那么这样做只需要分两种情况,一种是队长给下一士兵安排的时间大于上一个士兵做任务的时间,另一种是队长给下一个士兵安排的时间小于上一个士兵做任务的时间、  如果是第一种情况的话,我一定要将超过他们重合的时间加入我的总时间,并且将需要做任务的时间加入总时间,因为此时没有任何士兵在做任务、 如果第二种情况的话,由于此时有士兵在做任务,并且我在之前已经将他加入到总时间,那么就说明现在队长要交代的时间无需加入总时间、 最后将总时间输出便可、

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1100;
long long ans,cnt;
int n;
struct node{
    int x;
    int y;
}msq[maxn];
int cmd(struct node a,struct node b){
    if(a.y==b.y)
        return a.x<b.x;
    return a.y>b.y;
}
int main()
{
    int falg=1;
    while(scanf("%d",&n)&&n){
        for(int i=0;i<n;i++)
            scanf("%d%d",&msq[i].x,&msq[i].y);
        sort(msq,msq+n,cmd);
        ans=msq[0].x+msq[0].y,cnt=msq[0].y;
        for(int i=1;i<n;i++){
            if(msq[i].x<=cnt){
                cnt-=msq[i].x;
                if(cnt<=msq[i].y){
                    ans+=msq[i].y-cnt;
                    cnt=msq[i].y;
                }
            }
            else{
                ans+=msq[i].x-cnt;
                ans+=msq[i].y;
                cnt=msq[i].y;
            }
        }
        printf("Case %d: %lld\n",falg++,ans);
    }
    return 0;
}


第二种方法:这个方法比第一种方法要简单的多,根据题意,我们可知每次队长交代任务的时间与之前的每一次交代任务的时间都是一定要加入总时间的、因为每次交代任务的时间只能针对一个士兵、当然还要加上当前士兵要完成任务的时间,其实他要求找到的是所有士兵完成任务的最短时间,也就是求最后一个士兵完成的时间,每个士兵完成任务就要加上前n个队长交代士兵任务的时间,比较最大值,就是最后一个士兵完成的时间、 也就是所有士兵完成任务所需的最短时间、
AC代码:
<pre name="code" class="cpp">#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1100;
long long ans,cnt;
int n;
struct node{
    int x;
    int y;
}msq[maxn];
int cmd(struct node a,struct node b){
    if(a.y==b.y)
        return a.x<b.x;
    return a.y>b.y;
}
int main()
{
    int falg=1;
    while(scanf("%d",&n)&&n){
        for(int i=0;i<n;i++)
            scanf("%d%d",&msq[i].x,&msq[i].y);
        sort(msq,msq+n,cmd);
        ans=msq[0].x+msq[0].y;cnt=msq[0].x;
        for(int i=1;i<n;i++){
            cnt+=msq[i].x;
            ans=max(ans,cnt+msq[i].y);
        }
        printf("Case %d: %lld\n",falg++,ans);
    }
    return 0;
}


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值