CODEVS 3008 SSL 1423 加工生产调度

题目

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


分析

一看这道题就是贪心,问题是怎么贪心。
确定顺序后
伪代码

for (int i=1;i<=n;i++){
        lans+=x;//A车间
        rans=max(lans,rans);//B车间要等A车间
        rans+=y;//加上B车间的时间
}
最后求最大值!

问题是顺序怎么确定。(Johnson算法)
首先,一样产品如果在B车间的时间比A车间的时间多,那么优先,(A车间越早完成,越能开始B车间)
然后我们比较A车间和B车间最小时间,从小到大排序。
(如果是B车间最小,那么因为A车间时间长,所以放在后面)


代码

#include <iostream>
#include <algorithm>
#define MAXN 10001
using namespace std;
struct lszydd{int s1,s2;}work[MAXN]; int n;
bool cmp(lszydd x,lszydd y)
{
    if (x.s1<x.s2&&y.s1>=y.s2) return true;
    if (x.s1<x.s2&&y.s1<y.s2) return x.s1<y.s1;
    if (x.s1>=x.s2&&y.s1>=y.s2) return x.s2>y.s2;
    return 0;
}
int max(int a,int b){return (a>b)?a:b;}
int main(){
    ios::sync_with_stdio(0);
    while (1){
        cin>>n;
        if (!n) break;
        for (int i=1;i<=n;i++) cin>>work[i].s1;
        for (int i=1;i<=n;i++) cin>>work[i].s2;
        stable_sort(work+1,work+1+n,cmp);
        int ans1=0,ans2=0;
        for (int i=1;i<=n;i++){
            ans1+=work[i].s1;
            ans2=max(ans1,ans2)+work[i].s2;
        }
        cout<<ans2<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/80007717