牛の処理と生産スケジューリング問題オフ

牛の処理と生産スケジューリング問題オフ

タイトル

オリジナルタイトルリンク

工場は、nの製品の注文を受けた、n個の製品は、二つのワークショップA、Bで処理し、処理プラントをBにAの後に工場で処理されなければなりません。

処理時間2台の車両のI A、B内の製品はAiA_iAi、BiB_iBiました。最短全体の処理時間を作るためにこれらのn個の製品を処理する順序を調整する方法。時間の処理は、ここの手段を述べている:最終製品に最初の製品処理から開始時間のA、B 2回の完成処理ワークショップにすべてあります。

説明を入力します。

最初の行のみ-データnは、製品の数、
次のデータが時間N Nそれぞれに植物を処理する製品であり、
最後のN個のデータをN個のそれぞれのプロセスプラント製品Bを表します時間が必要。

出力説明

第1データ線、最小処理時間を表します

2行目の処理シーケンスの最小処理時間であります

問題の解決策のアイデア

アイデアから転載HO神のブログ

主なアイデアは、このです:短い処理時間のマシンが優先度のタスクを与えられるべきである、とB機で短い処理時間タスクは、背面にあるべきです。

コードの実装

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
 
struct node {
    int id,x,y;
}a[1001];
struct Node {
    int id, num;
}b[1001];
int cmp(Node x, Node y) {
    return x.num < y.num;
}
int ans[1001];
 
int main() {
    ll n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].x;
        a[i].id = i;
    }
    for (int i = 1; i <= n; i++) {
        cin >> a[i].y;
        b[i].num = min(a[i].x, a[i].y);//记录每个产品的最小工序时间
        b[i].id = i;
    }
    sort(b + 1, b + 1 + n, cmp);//按照最小工序时间从小到大排序
    int l=1, r=n;
    for (int i = 1; i <= n; i++) {
        //如果最小工序时间是第一道工序,就将其安排到前面
        if (b[i].num == a[b[i].id].x)ans[l++] = b[i].id;
        //如果最小工序时间是第二道工序,就将其安排到后面
        else ans[r--] = b[i].id;
    }
    //这样,ans就保存下来加工产品的最优顺序编号
    ll sum1=0, sum2=0;
    //sum1记录加工完第i个产品的第一道工序后所用的时间
    //sum2记录加工完第i个产品的第二道工序后所用的最优时间
    for (ll i = 1; i <= n; i++) {
        sum1 += a[ans[i]].x;
        //还没有加工第i个的第二道程序之前总时间取决于sum1,和sum2的最大值。
        sum2 = max(sum1, sum2);
        //之后在执行第二道工序
        sum2 += a[ans[i]].y;
    }
    cout << sum2 << endl;
    for (ll i = 1; i < n; i++) {
        cout << ans[i] << " ";
    }
    cout << ans[n] << endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/alking1001/p/11823716.html