SGU 259 Printed PR 贪心 单机调度问题

题意:有N份传单需要打印和送达。打印的时间是T,送达的时间是L。现在只有一台机器进行打印,有无限的人去送传单。问至少需要多长时间,才能将所有传单打印并送达完成。

思路:简单的单机调度问题。

           一般在单机调度问题中,顺序问题是需要考虑的一个问题。在直觉上,那些送达时间越长的作业应该越早处理。

           最终的结果的表达式为:Time = T1+T2+T3+......+Tn + max(  Li-(Ti+1  +...+Tn)  ), 而我们要最小化Time,因为前面的是定值,我们只要让 max( Li-(Ti + Ti+1 +...+Tn) ) 最小就可。。。。 

           可以容易的发现,当所有T相同的时候,我们要根据L从大到小进行排序。

           但是当T不相同的时候呢?

           下面的证明来自:http://blog.csdn.net/oceanlight/article/details/7862104 这是利用里剪贴-粘贴技术

           证明 :  (对于仅有两个对象a,b时)若Lb <La       已知Tb ,Lb ,Ta,Tb   。则  Lb -  Ta<La   于是La>max(Lb,La-Tb)。其中La为b在a前边max( Li-(Ti+1 +...+Tn) )的情况。 max(L(b,La-Tb)为a在b前边max( Li-(Ti+1 +...+Tn) )的情况。  因此a排在b的前边更优   则 当Lb <La 时 a 应排在 b的前边 

            对于多个对象是  设 c d 为序列中的两个  设c排在d前    则Lc <Ld。 c在d 前时为 max(Lc -Td -(Td+1 +......+Tn),Ld-(Td+1+........TN))  , c,d互换时 为max(Ld-Tc-(Td+1+....+Tn),Lc-(Td+1+......Tn))       因为max(Lc-Td,Ld)  >max(Ld-Tc,Lc)  所以 c ,d 互换即d排在c之前值是使解为最优解 。
            这样,我们就得到了,不会失去最优解的顺序。
            剩下的,只需遍历一遍找到最终的答案就行了。
代码如下:
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

struct node{
    int t,l;
    node(){}
    node(int tt, int ll):t(tt),l(ll){}
    bool operator < (const node & rhs) const{
        return l > rhs.l;
    }
} ev[110];

int main(void)
{
    //freopen("input.txt","r",stdin);
    int N;
    scanf("%d",&N);
    for(int i = 0; i < N; ++i)
        scanf("%d",&ev[i].t);
    for(int i = 0; i < N; ++i)
        scanf("%d",&ev[i].l);
    sort(ev,ev+N);
    int ans = 0,cur = 0;
    for(int i = 0; i < N; ++i){
        cur += ev[i].t;
        ans = max(ans,cur + ev[i].l);
    }
    printf("%d\n",ans);
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值