「一本通 1.1 例 4」加工生产调度

题目传送门

解题思路

这道题是Johnson双流水线调度算法的基础题。

本题是要求一个加工顺序使得总的加工时间最少,而要使加工时间最少,就是让各车间的空闲时间最少。一旦A车间开始加工,便会不停地进行加工(我们不要去管车间是否能够一直生产,因为他们有三班,可以24时间不停地运转)。关键是B车间在生产的过程中,有可能要等待A车间的初加工产品。很显然所安排的第一个产品在A车间加工时,B车间是要等待的,最后一个产品在B车间加工时,A车间已经完成了任务。

要使总的空闲时间最少:

(1)就要把在A车间加工时间最短的部件优先加工,这样使得B车间能以最快的速度开始加工;

(2)把放在B车间加工时间最短的产品放在最后加工,这样使得最后A车间的空闲时间最少。

更严格的数学证明

#include <bits/stdc++.h>
#define _for(i,a,n) for(int i=a;i<n;++i)
#define rep(i,a,n)for(int i=a;i<=n;++i)
#define input() int T;cin>>T;while(T--)
#define close() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef long long ll;
template<class T>inline void read(T &x){bool Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
using namespace std;
const int maxn = 1e3;

struct node {
    int id; //工作编号
    int t; //工作时间
    int ab; //所属哪台机器

    inline bool operator < (const node &b) const {
        return t < b.t;
    }
    node(int _id = 0,int _t = 0,int _ab = 0):id(_id), t(_t), ab(_ab){} 
}arr[maxn + 5];

int n, a[maxn + 5], b[maxn + 5], ans[maxn + 5], ti[maxn + 5];

void Johnson()
{
    rep(i, 1, n) {
        if(a[i] < b[i]) arr[i] = node(i, a[i], 0);
        else arr[i] = node(i, b[i], 1);
    }
    sort(arr + 1, arr + n + 1);
    int l = 0, r = n + 1;
    rep(i, 1, n) {
        if(!arr[i].ab) ans[++l] = arr[i].id;
        else ans[--r] = arr[i].id;
    }
}

int main()
{
    read(n);
    rep(i, 1, n) read(a[i]);
    rep(i, 1, n) read(b[i]);
    Johnson();
    rep(i, 1, n) ti[i] = ti[i - 1] + a[ans[i]];
    int sum = ti[1] + b[ans[1]];
    rep(i, 2, n) sum = max(sum, ti[i]) + b[ans[i]];
    cout << sum << endl;
    _for(i, 1, n) cout << ans[i] << " ";
    cout << ans[n] <<endl; 
    return 0;
}

posted @ 2018-12-25 09:19  schrodingercatss  阅读(392)  评论(0编辑  收藏  举报