内存限制:512 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:Special Judge
上传者: 1bentong
题目描述
某工厂收到了 nnn 个产品的订单,这 nnn 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。
某个产品 iii 在 A,B 两车间加工的时间分别为 Ai,BiA_i, B_iAi,Bi。怎样安排这 nnn 个产品的加工顺序,才能使总的加工时间最短。
这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。
输入格式
第一行仅—个数据 nnn ,表示产品的数量;
接下来 nnn 个数据是表示这 nnn 个产品在 A 车间加工各自所要的时间;
最后的 nnn 个数据是表示这 nnn 个产品在 B 车间加工各自所要的时间。
输出格式
第一行一个数据,表示最少的加工时间;
第二行是一种最小加工时间的加工顺序。
样例
样例输入
5
3 5 8 7 10
6 2 1 4 9
样例输出
34
1 5 4 2 3
数据范围与提示
对于 100%100\%100%的数据, 0<n<10000<n<10000<n<1000,所有数值皆为整数。
懒得写了直接抄上了, 详见一本通
1 //2018-08-03 20:09:13 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 10001; 9 10 int ans[N], a[N], b[N], m[N], s[N]; 11 int n; 12 13 int main(){ 14 scanf("%d", &n); 15 for(int i=1; i<=n; i++) scanf("%d", &a[i]); 16 for(int i=1; i<=n; i++) scanf("%d", &b[i]); 17 //********** 18 for(int i=1; i<=n; i++){ 19 m[i] = min(a[i], b[i]); 20 s[i] = i; 21 } 22 for(int i=1;i<=n-1; i++) 23 for(int j=i+1; j<=n; j++) 24 if(m[i] > m[j]){ 25 swap(m[i], m[j]); swap(s[i], s[j]); 26 } 27 int k=0, t=n+1; 28 for(int i=1; i<=n; i++) 29 if(m[i] == a[s[i]]){ 30 k++; ans[k] = s[i]; 31 }else{ 32 t--; ans[t] = s[i]; 33 } 34 k = 0, t = 0; 35 for(int i=1; i<=n; i++){ 36 k += a[ans[i]]; 37 if(t < k) t = k; 38 t += b[ans[i]]; 39 } 40 printf("%d\n", t); 41 for(int i=1; i<=n; i++) printf("%d ", ans[i]); 42 printf("\n"); 43 44 return 0; 45 }