题意:现在有2台机器,n件任务,每件任务必须先在机器1上做,做完之后再在机器2上做,各任务之间的加工顺序任意。给出每件任务在两个机器上做的时间,求最早的完工时间.
思路:(参考http://blog.csdn.net/tmeteorj/article/details/9273403)的cmp函数:return x.a+max(y.a,x.b)+y.b<y.a+max(x.a,y.b)+x.b;
另一种思路:1>把作业按工序加工时间分成两个子集,第一个集合中在S1上做的时间比在S2上少,其它的作业放到第二个集合.先完成第一个集合里面的作业,再完成第二个集合里的作业。 2> 对于第一个集合,其中的作业顺序是按在S1上的时间的不减排列;对于第二个集合,其中的作业顺序是按在S2上的时间的不增排列.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define N 10002
struct node{
int a,b;
}s[N],t[N];
int n;
int cmp1(const struct node *a,const struct node *b){
return (*a).a - (*b).a;
}
int cmp2(const struct node *a,const struct node *b){
return (*b).b - (*a).b;
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%d",&n) && n){
int i,a,b,m1,m2;
m1 = m2 = 0;
for(i = 0;i<n;i++){
scanf("%d %d",&a,&b);
if(a < b){
s[m1].a = a;
s[m1++].b = b;
}else{
t[m2].a = a;
t[m2++].b = b;
}
}
qsort(s,m1,sizeof(struct node),cmp1);
qsort(t,m2,sizeof(struct node),cmp2);
if(m1)
a = b = s[0].a;
for(i = 1;i<m1;i++){
a += s[i].a;
b += s[i-1].b;
b = Max(a,b);
}
if(!m1 && m2){
a = b = t[0].a;
}else if(m1 && !m2){
b += s[m1-1].b;
}else if(m1 && m2){
a += t[0].a;
b += s[m1-1].b;
b = Max(a,b);
}
for(i = 1;i<m2;i++){
a += t[i].a;
b += t[i-1].b;
b = Max(a,b);
}
if(m2)
b += t[m2-1].b;
printf("%d\n",b);
}
return 0;
}