フローショップスケジューリング問題の
説明:
Nジョブは{1,2、......、n}は、パイプライン処理では、二つの機械そのM1及びM2によって完成されます。各ジョブの処理順序は、次にM2の処理、M1で最初に処理されます。
ジョブ及びIを処理するのに必要な時間のM1及びM2は、それぞれ1≤i≤n、両性愛。問題の組立ラインの高さ要件は、n個の操作の最適な処理シーケンスを決定するように最初からジョブ
機M1、M2マシン上で処理を完了するために必要な最後のジョブ最小時間に開始加工。
あなたが作業を開始すると、タスクが完了するまで、彼らは中断されない任意のタスクを想定して、すなわち非優先スケジューリングすることができます。
入力:
入力は、ユースケースの数、最初の正の整数の挙動を含んK(1 <= K <= 1000)、 症例数、Kの次のユースケースで表され、ジョブ番号Nの第一の実施形態(各1 <= N <= 1000)、
それぞれ二つの非負整数の次のn行、第一マシンの処理時間と第2の機械。
出力:
各時間即ち、第1のマシンから第2の機械端にスケジューリングユースケースにおける出力の一行を用いる全体の最適な使用、。
サンプル入力:
1
。4
。5 6
12 2
4 14。
8. 7。
サンプル出力:
33
アルゴリズムの説明:
1令N1 = {I | そして<BI}、N2 = {I | そして> = BI}
非減少AI、N2仕事ソート双方向非増加により、2 N1ジョブソート
図3は、法律のジョンソンを満たすために最適なスケジュールを構成します
#include <iostream>
#include <algorithm>
using namespace std;
class JOB
{
public:
int key,index;
bool job;
};
bool cmp(JOB a,JOB b)
{
return a.key<b.key;
}
int func(int n,int a[],int b[],int c[])
{
int i,j,k;
JOB *d =new JOB[n];
for(i=0;i<n;i++)
{
if(a[i]<b[i])
{
d[i].job =true;
d[i].key =a[i];
}
else
{
d[i].job=false;
d[i].key=b[i];
}
d[i].index=i;
}
sort(d,n+d,cmp);
j=0,k=n-1;
for(i=0;i<n;i++)
{
if(d[i].job ==true)
c[j++]=d[i].index;
else
c[k--]=d[i].index;
}
j=a[c[0]];
k=j+b[c[0]];
for(i=1;i<n;i++)
{
j=j+a[c[i]];
k= j<k ? k+b[c[i]] : j+b[c[i]] ;
}
delete d;
return k;
}
int main()
{
int i,n,m,a[100],b[100],c[100];
cin>>n;
while(n--)
{
cin>>m;
for(i=0;i<m;i++)
{
cin>>a[i];
cin>>b[i];
}
cout<<func(m,a,b,c)<<endl;
}
return 0;
}
結果:
ます。https://my.oschina.net/u/204616/blog/544994で再現