#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)这个题目的解答还有没有改进的地方?