题目描述
某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。
某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。
输入格式
第一行仅—个数据n(0<n<1000),表示产品的数量。
接下来n个数据是表示这n个产品在A车间加工各自所要的时间(都是整数)。
最后的n个数据是表示这n个产品在B车间加工各自所要的时间(都是整数)。
输出格式
第一行一个数据,表示最少的加工时间;
第二行是一种最小加工时间的加工顺序。
输入输出样例
输入 #1
5
3 5 8 7 10
6 2 1 4 9
输出 #1
34
1 5 4 2 3
思路
代码
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=1010; int n; struct no { int a,b,minn,pm; } t1[N],t2[N]; bool cmp(no a,no b) { return a.minn<b.minn; } int main() { scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&t1[i].a); for(int i=1; i<=n; i++) scanf("%d",&t1[i].b); for(int i=1; i<=n; i++) { t1[i].minn=min(t1[i].a,t1[i].b); t1[i].pm=i; } sort(t1,t1+n+1,cmp); int l=1,r=n; for(int i=1; i<=n; i++) { if(t1[i].minn==t1[i].a) t2[l++]=t1[i]; else t2[r--]=t1[i]; } int i=1,at=0,bt=0,t=t2[1].a; t2[n+1].a=0; while(i<=n) { bt+=t2[i].b; at=t2[++i].a; if(at<bt) { bt-=at; t+=at; at=0; } else if(at>=bt) { t+=at; at=0; bt=0; } } t+=bt; printf("%d\n",t); for(int i=1; i<=n; i++) printf("%d ",t2[i].pm); printf("\n"); return 0; }
原文地址:https://www.cnblogs.com/mysh/p/11795731.html
时间: 2024-11-08 22:48:13