poj 2751 双机调度问题Johnson算法(贪心) -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    题意:

    2台机器,n件任务,每件任务必须先在S1上做,再在S2上做,

poj 2751 双机调度问题Johnson算法(贪心)

。任务之间先做后做任意。求最早的完工时间。

    分析:

    这是一个经典问题:2台机器的情况下有多项式算法(Johnson算法),3台或以上的机器是NP-hard的。Johnson算法思想就是贪心,时间复杂度是O(nlogn) 。Johnson算法: (1) 把作业按工序加工时间分成两个子集,第一个集合中在S1上做的时间比在S2上少,其它的作业放到第二个集合。先完成第一个集合里面的作业,再完成第二个集合里的作业。 (2) 对于第一个集合,其中的作业顺序是按在S1上的时间的不减排列;对于第二个集合,其中的作业顺序是按在S2上的时间的不增排列。

    代码:

//poj 2751//sep9#include<iostream>#include  using namespace std;const int maxN=10024;struct NODE{	int x,y;}a[maxN],b[maxN];int cmp1(NODE p,NODE q){	return p.x<q.x; int="" node="" p.y="" return="">q.y;}int s1_finish_time[maxN];int main(){	int n;	while(scanf("%d",&n)==1&&n){		int len1=0,len2=0;		for(int i=0;i<n;++i){ .x="x;" .y="y;" i="len1;i<len1+len2;++i)" int="" sum="">=s1_finish_time[i])				sum+=a[i].y;			else				sum=s1_finish_time[i]+a[i].y;		}			printf("%d\n",sum);	}	return 0;	}</n;++i){></q.x;></iostream>

最新文章