poj 2751 贪心(双机调度)

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


你可能感兴趣的:(poj 2751 贪心(双机调度))