題意:有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的前邊
#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;
}