LOJ#10003. 「一本通 1.1 例 4」加工生产调度

内存限制: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 }

猜你喜欢

转载自www.cnblogs.com/sineagle/p/9416139.html