zoukankan      html  css  js  c++  java
  • 福州网赛出题一囧...

    有两台机器A和B,有n项任务,每个任务都必须在两台机器上进行加工,而且要先在A机器上加工之后才能在B机器上加工,对于第i个任务A机器加工时间为Ai,B机器加工时间为Bi,每台机器同时只能加工一项任务。问如何安排才能使加工完全部工作的时间最短。

      

    这题本来是打算放在福州赛区网络赛的题,后来测题的时候被一个队员Google到了原题(强烈鄙视其比赛时候搜代码的行为),甚至有专门针对这个问题的定理,然后就囧掉了,想要换掉这题,后来又严重脑残,结果就成了现在的样子,有史以来最简单的网络赛题+最合格的签到题!! - -|||

      

      

    解决这个问题网上的方法是Johnson's Rule,英文wiki上有一段简短的说明,没找到什么证明方法,实现很简单,将任务分为Ai<Bi和Bi<=Ai两部分,然后对第一部分按照Ai的大小从小到大排序,后一部分按照Bi的大小从大到小排序,然后贪心即可。虽然没有证明,和我的程序对拍1w组极限数据都是OK的(- -|| 貌似只能说明我的程序没有明显bug)

      

    所谓的我的程序是这么来的...

    这个题目还是别人问我的,他说他们老师教他们怎样怎样排序,他不会实现就来问我,我看了下明显是错的(具体也忘了什么了),后来就和Su_Xing大神讨论了这个题目,Su_Xing大神很快想出了按照 min(Ax,By)和min(Ay,Bx)排序的方法,然后做贪心,试了几个数据都是对的,强力膜拜啊,简单证明了一下就放在那里了,后来hh说要把这题放网络赛,就和Su_Xing大神一起写详细的证明题解,另外还发现了一个很给力的trick,证明如下:

      

    先推出两个基础公式:

    A机器从0 min开始空闲,B机器从t min时间开始空闲 Ax Bx, Ay By

    两个任务xy,先做x任务,再做y任务,有:

    Ax<t时,T=Max(t+Bx,Ax+Ay)+By

    Ax>=t时,T=Ax+By+Max(Ay,Bx)

     

    开始分情况讨论,两个任务xyA机器从0 min开始空闲, B机器从t min时间开始空闲 Ax Bx, Ay By

     

    Ax>=t Ay>=t 时:

    Txy=Ax+By+Max(Ay,Bx)

    Tyx=Ay+Bx+Max(Ax,By)

    Txy<Tyx 时,有

    Ax+By+Max(Ay,Bx)<Ay+Bx+Max(Ax,By)

    Ax+By-Max(Ax,By)<Ay+Bx-Max(Ay,Bx)

    Min(Ax,By)<Min(Ay,Bx)

    同样可以从Min(Ax,By)<Min(Ay,Bx)推出Txy<Tyx

     

    我们得到了一个很诡异的关系式,然后就YY是不是只要满足这个关系就行了呢

    来证明一下在其他情况下是不是同样成立:

    Ax < t && Ay >= t

    Txy=Max(t+Bx,Ax+Ay)+By

    Tyx=Ay+Bx+Max(Ax,By)

     

    要证明如果Min(Ax,By)<=Min(Ay,Bx) 则有Txy<=Tyx

    只需证明若Txy<=Tyx不成立(即Txy>Tyx), Min(Ax,By)>Min(Ay,Bx)

    证明如下:

    Txy>Tyx

    Max(Bx+t,Ax+Ay)+By>Max(Ax,By)+Ay+Bx

    P1 = Bx+By+t, P2 = Ax+Ay+By, P3 = Ax+Ay+Bx, P4 = Ay+Bx+By

    ð  1. P1>P2 P3>=P4  ->  t>Ay与条件矛盾

    ð  2. P2>=P1 P3>=P4  ->  {Bx<By,By<=Ax,Bx<Ay}  ->  得证

    ð  3. P1>P2 P4>P3  ->  t>Ay与条件矛盾

    ð  4. P2>=P1 P4>P3  ->  {Bx<Ax,Bx<Ay,Ax<By}  ->  得证

     

    另外的两种情况和上面证明方法相同,其实就是穷举所有情况

      

    得到这样的关系我们可以想到如果任意两个任务都满足上述关系的话,那么这样的顺序肯定是最优的,但是如何满足呢,自然是排序,但这两样的关系可以排序吗,他不是简单的大小关系,那就要证明是否满足不等关系的传递性,如果出现 A>B,B>C,C>A这样,那么就悲剧了,不能排序了,这个关系是否能满足呢,继续证明,怎么证,枚举!!枚举是万能的,我们举出三件任务,枚举六个变量的大小关系,证明他是否满足传递关系,但是我们发现他是不满足的~~

    x=y, x=z 不能推出y=z,比如 (2,2)(4,3)(5,6),这样排序就不能保证yz的关系是正确的,相等关系时两者谁在前谁在后是无所谓的,我们把相等变为不相等,指定x<y,x<z(x>y,x>z),排序时就会去判断yz的关系,就不会出错了。相等情况时肯定会有一个数存在两次,而且这个数最小,设为a,b,c (b>=a,c>=a) (a,b)(a,c)(b,a)(c,a)这两种情况是具有传递性的,可以任意排序,(a,a)(b,c)这种情况下我们都按照前面的那个数排序就可以保证(a,a)分配在所有和他相等的任务前面了,这样就完美的解决了这个问题

      

    证明完了,其实我们想一下存在这样反例的原因,就是因为他的序列的不唯一性,对于一个任务他可以在一个区间内的任何位置去做(两个任务相等自然是可以互换顺序的),如果这个任务的位置改变那么就会出现更优解,如果保证了无论怎么样的等价变换都不会产生更优解,那么该解就是最优的了


      

    所以最终我们得到的方法是按照min(Ax,By)和min(Ay,Bx)进行排序,相等的话按照Ai从小到大排序或者Bi从大到小排序(反过来是不行的,可以想下为什么)。这种方法代码实现比Johnson's rule还要简短哦~~

  • 相关阅读:
    转:修改虚拟机参数
    NhiberNate 和linq学习博客园网址
    如何配置sqlserver 以允许远程连接
    Mongodb安装配置文档
    IIS安装和配置
    Mvc篇
    在Castle中使用nhibernate
    多线程
    WCF REST系列文章汇总(共9篇)
    测试Api工具Fiddler
  • 原文地址:https://www.cnblogs.com/ambition/p/Double_Machine.html
Copyright © 2011-2022 走看看