题意:有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;
}