加工生产调度(贪心)

加工生产调度

Description

  某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。
  某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。

Input

  第一行仅—个数据n(0 < n < 1000),表示产品的数量。接下来n个数据是表示这n个产品在A车间加工各自所要的时间(都是整数)。最后的n个数据是表示这n个产品在B车间加工各自所要的时间(都是整数)。

Output

  第一行一个数据,表示最少的加工时间;第二行是一种最小加工时间的加工顺序。

Sample Input

5 3 5 8 7 10 6 2 1 4 9

Sample Output

34 1 5 4 2 3

代码

#include<iostream>
#include<algorithm>
using namespace std;
struct point {
    int x,y,minn,i;
};
bool operator<(const point&x,const point&y) {
    return x.minn<y.minn;
}
point a[1005];
int ans[1005];
int main() {
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)cin>>a[i].x;
    for(int i=1; i<=n; i++)cin>>a[i].y;
    for(int i=1; i<=n; i++) {
        a[i].minn=min(a[i].x,a[i].y);
        a[i].i=i;
    }
    sort(a+1,a+1+n);
    int x=1,y=n;
    for(int i=1; i<=n; i++) {
        if(a[i].minn==a[i].x)ans[x++]=a[i].i;
        else ans[y--]=a[i].i;
    }
    int timea=0,timeb=0,mina=2100000000,minb=2100000000;
    for(int i=1; i<=n; i++) {
        timea+=a[i].x;
        timeb+=a[i].y;
        mina=min(mina,a[i].x);
        minb=min(minb,a[i].y);
    }
    cout<<max(timea+minb,timeb+mina)<<endl;
    for(int i=1; i<=n; i++)cout<<ans[i]<<' ';
    return 0;
}

猜你喜欢

转载自blog.csdn.net/niuniu0205/article/details/81449538