sgu-259 Printed PR

59 篇文章 1 订阅
3 篇文章 0 订阅
题目大意:

N(N<=100) 个产品,每个产品有两个属性 Ti,Li ,表示做这个产品的所需时间和递送时间,递送必须在产品完成后开始,在递送时可以进行下一个产品的制作。同一时间内只能有一个产品在制作,但是可以有多个产品递送,问递送完所有的产品的时间。

解题思路:

经典贪心题目,白书上好像有原题吧。
思路就是将所有的产品按递送时间从大到小排序,然后直接从前往后做就行了。
证明:
首先,显然完成所有产品的时间是确定的。然后我们考虑交换两个产品的制作顺序。
1. 如果 Li>Li+1 ,那么总时间就是 Ti+Ti+1+max{Li+1,LiTi+1} ,如果交换之后就是 Ti+Ti+1+max{Li,Li+1Ti} ,由于 Li>Li+1 所以 max{Li+1,LiTi+1}<=Li<=max{Li,Li+1Ti} ,显然时间要变长。

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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值