题目大意:
有N(N<=100)个产品,每个产品有两个属性Ti,Li,表示做这个产品的所需时间和递送时间,递送必须在产品完成后开始,在递送时可以进行下一个产品的制作。同一时间内只能有一个产品在制作,但是可以有多个产品递送,问递送完所有的产品的时间。
解题思路:
经典贪心题目,白书上好像有原题吧。
思路就是将所有的产品按递送时间从大到小排序,然后直接从前往后做就行了。
证明:
首先,显然完成所有产品的时间是确定的。然后我们考虑交换两个产品的制作顺序。
1.如果Li>Li+1,那么总时间就是Ti+Ti+1+max{Li+1,Li?Ti+1},如果交换之后就是Ti+Ti+1+max{Li,Li+1?Ti},由于Li>Li+1所以max{Li+1,Li?Ti+1}<=Li<=max{Li,Li+1?Ti},显然时间要变长。
AC代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
int N;
struct task_
{
int T,L;
}task[110]={{0,0}};
bool cmp(struct task_ a1,struct task_ a2)
{return a1.L>a2.L;}
int main()
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&task[i].T);
for(int i=1;i<=N;i++)
scanf("%d",&task[i].L);
sort(task+1,task+N+1,cmp);
int st=0;
int ans=0;
for(int i=1;i<=N;i++)
{
st+=task[i].T;
ans=max(ans,st+task[i].L);
}
cout<<ans<<endl;
return 0;
}
时间: 2024-10-05 10:12:49