hdu 4070

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100004
struct node
{
    int s,t;
}ans[N];
bool cmp(node a,node b)
{
    if(a.t!=b.t)return a.t>b.t;
    else a.s>b.s;
}
int main()
{
    int t,c=0,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&ans[i].s,&ans[i].t);
        }
        sort(ans,ans+n,cmp);
        int ans1=0,time=0;
        for(int i =0;i<n;i++)
        {
            time+=ans[i].s;
            ans1=max(time+ans[i].t,ans1);
        }
        printf("Case %d: %d\n",++c,ans1);
    }
    return 0;
}

福州赛区的网选题目;贪心的题目。

仔细分析一下这个题目;

(1)题目为什么要这样做。

        首先分析一下题意。题目大意是有一个细胞,每分钟都产生一个噬菌体。这些噬菌体能够感人细胞。一个细胞被感染的时间是这样计算的。如果一个细胞被感染需要n噬菌体,并且这些细胞到达将被感染细胞时间是m,那么这个细胞被感染的时间就是m+n。题目求的是,所有的细胞被感染后所用的最短的时间。

        这个题目需要做两步工作。第一是,排序。第二是,贪心。排序是贪心得以进行的前提。按照达到时间最大的排序,这样我们得到了一个最短的时间(想一想,到达时间最大的这个时间一定是小于等于所有细胞被感染的最短时间的,所以我们把这个时间最为最短时间来进行更新)。这个时间就是我们更新的基础。接下来的步骤就是更新时间。我们要做的就是按照排序后的结果,来判断时间是否需要更新。这样一步一步进行下去,每一步都得到的是最优的解,最后得到了整体最优解。这就是贪心。其实排序是一种贪心的策略。

        这个题目排序工作想要达到的目的必需要想清楚了。这是理解这个题目的关键。

       流程图:

           

(2)这个题目的解答还有没有改进的地方?

(3)还有其他的方法吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值