1425:加工生產調度

 

【題目描述】

某工廠收到了 nn 個產品的訂單,這 nn 個產品分別在 A、B 兩個車間加工,並且必須先在 A 車間加工後纔可以到 B 車間加工。

某個產品 ii 在 A,B 兩車間加工的時間分別爲Ai,BiAi,Bi。怎樣安排這 nn 個產品的加工順序,才能使總的加工時間最短。

這裏所說的加工時間是指:從開始加工第一個產品到最後所有的產品都已在 A,B 兩車間加工完畢的時間。

【輸入】

第一行僅—個數據 nn ,表示產品的數量;

接下來 nn 個數據是表示這 nn 個產品在 A 車間加工各自所要的時間;

最後的 nn 個數據是表示這 nn 個產品在 B 車間加工各自所要的時間。

【輸出】

第一行一個數據,表示最少的加工時間;

第二行是一種最小加工時間的加工順序。

【輸入樣例】

5
3 5 8 7 10
6 2 1 4 9

【輸出樣例】

34
1 5 4 2 3

【提示】

對於100%的數據, 0 < n < 10000,所有數值皆爲整數。

//#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define rush() int T;cin>>T;while(T--)
#define go(a) while(cin>>a)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
#define debug(a) cout<<"*"<<a<<"*"<<endl
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//#define s first
//#define e second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<double,double> Pair;
const int inf=0x3f3f3f3f;
const int N=1e4+5;

    int n,m,t;
    int i,j,k;
    int a[N],b[N],minn[N],pos[N],ans[N];
int main()
{
    IOS;
    while(cin>>n){
        for(i=0;i<n;i++) cin>>a[i];
        for(i=0;i<n;i++){
            cin>>b[i];
            minn[i]=min(b[i],a[i]);
            pos[i]=i;
        }
        for(i=0;i<=n-2;i++){
            for(j=i+1;j<n;j++){
                if(minn[i]>minn[j]){
                    swap(minn[i],minn[j]);
                    swap(pos[i],pos[j]);
                }
            }
        }
        int head=0,tail=n-1;
        for(i=0;i<n;i++){
            if(minn[i]==a[pos[i]]){
                ans[head++]=pos[i];
            }
            else{
                ans[tail--]=pos[i];
            }
        }
        int ta=0,tb=0;
        for(i=0;i<n;i++){
            ta+=a[ans[i]];
            if(ta>tb) tb=ta;
            tb+=b[ans[i]];
        }
        cout<<tb<<endl;
        for(i=0;i<n;i++) cout<<ans[i]+1<<" ";
        cout<<endl; break;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章