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