码迷,mamicode.com
首页 > 其他好文 > 详细

sgu-259 Printed PR

时间:2015-06-01 22:45:35      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:

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;
} 

sgu-259 Printed PR

标签:

原文地址:http://blog.csdn.net/qq_21995319/article/details/46315395

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!