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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章