5924: 加工生产调度(贪心)

描述

 

某工厂收到了 n 个产品的订单,这 n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。

某个产品 i 在 A,B 两车间加工的时间分别为Ai,Bi。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。

这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。

 

输入

 

第一行仅—个数据 n ,表示产品的数量;

接下来 n 个数据是表示这 n个产品在 A 车间加工各自所要的时间;

最后的 n 个数据是表示这 n 个产品在 B 车间加工各自所要的时间。

 

输出

 

输出最少的加工时间。

样例输入

样例输出

提示

解题思路:刚开始要A小 B等待的时间少 最后要B小 A全部完成之后要等B完成

取每一组A和B的最小值进行排序 A组小的放前面 B组小的放后面  然后进行贪心

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int ans[10005];
 5 struct Node{
 6     int x,y;
 7 }A[10005];
 8 
 9 struct Edg{
10     int time,B1,B2;
11     bool operator<(const Edg&X) const{
12         return time<X.time;
13     }
14 }B[10005];
15 
16 
17 int main()
18 {
19     ios::sync_with_stdio(false);
20     cin>>n;
21     for(int i=1;i<=n;i++) cin>>A[i].x;
22     for(int i=1;i<=n;i++) cin>>A[i].y;
23     for(int i=1;i<=n;i++){
24         int flag;
25         if(A[i].x<A[i].y) flag=0;
26         else flag=1;
27         B[i]={min(A[i].x,A[i].y),i,flag};
28     }
29     sort(B+1,B+1+n);
30     int left=0,right=n+1;
31     for(int i=1;i<=n;i++){
32         if(B[i].B2==1) ans[--right]=B[i].B1;
33         else{
34             ans[++left]=B[i].B1;
35         }
36     }
37     int max1=0,max2=0;
38     for(int i=1;i<=n;i++){
39         max1+=A[ans[i]].x;
40         max2=max(max2,max1)+A[ans[i]].y;
41     }
42     cout << max2 << endl;
43     return 0;
44 }
View Code

对于100%的数据, 0 < n < 10000,所有数值皆为整数。

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/11228333.html