zoukankan      html  css  js  c++  java
  • 【洛谷P1248】加工生产调度

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

    题解:可以先考虑只有两个物品的情况,设两个物品的加工时间分别为 (a_1,b_1,a_2,b_2),则先加工 A 再加工 B 的总时间为 (a_1+max(b_1,a_2)+b_2),先加工 B 再加工 A 的总时间为 (a_2+max(b_2,a_1)+b_1)。若前者更优,则有 (max(b_1,a_2)-b_1-a_2<max(b_2,a_1)-a_1-b_2),整理得 (min(a_1,b_2)<min(b_1,a_2)),按照这个贪心原则即可得到正确答案,详细证明请参照Johnson 法则。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1000;
    
    struct node{int a,b,idx;}e[maxn];
    int n,stk[maxn],top;
    
    bool cmp(node& x,node &y){
    	return min(x.a,y.b)<min(x.b,y.a);
    }
    
    void read_and_parse(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)scanf("%d",&e[i].a);
    	for(int i=1;i<=n;i++)scanf("%d",&e[i].b),e[i].idx=i;
    	sort(e+1,e+n+1,cmp);
    }
    
    void solve(){
    	int ta=0,tb=0;
    	for(int i=1;i<=n;i++){
    		ta+=e[i].a;
    		tb=max(ta,tb)+e[i].b;
    		stk[++top]=e[i].idx;
    	}
    	printf("%d
    ",tb);
    	for(int i=1;i<=n;i++)printf("%d%c",stk[i],i==n?'
    ':' ');
    }
    
    int main(){
    	read_and_parse();
    	solve();
    	return 0;
    }
    
  • 相关阅读:
    mongodb的账户管理
    mongo备份与恢复
    mongo索引
    聚合aggregate
    07-【jsp基本了解】
    Servlet登录小案例
    06-【servletconfig、servletContext 】
    05-【session、cookie】
    jQuery
    04-【servlet转发和重定向】
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10010195.html
Copyright © 2011-2022 走看看