加工生产调度(信息学奥赛一本通-T1425)

【题目描述】

某工厂收到了 n 个产品的订单,这 n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。

某个产品 i 在 A,B 两车间加工的时间分别为Ai,Bi。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。

这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。

【输入】

第一行仅—个数据 n ,表示产品的数量;

接下来 n 个数据是表示这 n 个产品在 A 车间加工各自所要的时间;

最后的 n 个数据是表示这 n 个产品在 B 车间加工各自所要的时间。

【输出】

第一行一个数据,表示最少的加工时间;

第二行是一种最小加工时间的加工顺序。

【输入样例】

5
3 5 8 7 10
6 2 1 4 9

【输出样例】

34
1 5 4 2 3

【源程序】

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 100000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
struct Node{
    int num;
    int id;
}m[N];
int a[N],b[N];
int res[N];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&b[i]);

    for(int i=1;i<=n;i++){
        m[i].num=min(a[i],b[i]);
        m[i].id=i;
    }
    for(int i=1;i<=n-1;i++){
        for(int j=i+1;j<=n;j++){
            if(m[i].num>m[j].num){
                swap(m[i],m[j]);
            }
        }
    }


    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

 

你可能感兴趣的:(#,信息学奥赛一本通,#,基础算法——调度问题)