T1452 加工生產調度(信息學奧賽一本通)(貪心)

【問題】

某工廠收到了 n 個產品的訂單,這 n 個產品分別在 A、B 兩個車間加工,並且必須先在 A 車間加工後纔可以到 B 車間加工。
某個產品 i 在 A,B 兩車間加工的時間分別爲Ai,Bi。怎樣安排這 n 個產品的加工順序,才能使總的加工時間最短。
這裏所說的加工時間是指:從開始加工第一個產品到最後所有的產品都已在 A,B 兩車間加工完畢的時間。

【輸入】

第一行僅—個數據 n ,表示產品的數量;
接下來 n 個數據是表示這 n 個產品在 A 車間加工各自所要的時間;
最後的 n 個數據是表示這 n 個產品在 B 車間加工各自所要的時間。

【輸出】

第一行一個數據,表示最少的加工時間;
第二行是一種最小加工時間的加工順序。
****

【思路】

一且A機器開始加工,則A機器將會不停地進行作業,關鍵是B機器在加工過程中有可能要等待A機器。很明顯第一個部件在A機器上加工時,B機器必須等待,最後一個部件在B機器上加工時,A機器也在等待B機器的完工
要使機器總的空閒時間最短,就要把在A機器上加工時間最短的部件最先加工,這樣使得B機器能在最短的空閒時間內開始加工;把在B機器上加工時間最短的部件放在最後加工,這樣使得A機器用最短時間等待B機器完工
貪心策略:
將M按照從小到大的順序排序,然後從第1個開始處理,若Mi=ai,則將它排在從頭開始的作業後面,若Mi=bi,則將它排在從尾開始的作業前面。
*

【源代碼】

#include<bits/stdc++.h>
using namespace std;
const int N = 100000+5;
struct Node
{
    int num;
    int id;
    bool operator <(Node&a)
    { return num < a.num; }
} m[N];
int a[N],b[N];
int res[N];
int main()
{
    int n;
    cin >> n;
    for(int i=1; i<=n; i++)
        cin >> a[i];
    for(int i=1; i<=n; i++)
        cin >> b[i];
    for(int i=1; i<=n; i++)
    {
        m[i].num=min(a[i],b[i]);
        m[i].id=i;
    }
    sort(m+1,m+1+n);
    int head=0,tail=n+1;
    for(int i=1; i<=n; i++)
    {
        int num=m[i].num;
        int id=m[i].id;
        if(num==a[id])
            res[++head]=id;
        else
            res[--tail]=id;
    }
    int timeA=0,timeB=0;
    for(int i=1; i<=n; i++)
    {
        timeA+=a[res[i]];
        if(timeB<timeA)
            timeB=timeA;
        timeB+=b[res[i]];
    }
    cout << timeB <<endl;;
    for(int i=1; i<=n; i++)
        cout << res[i] << " ";
    cout <<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章