输入样例
4
1 3 5 7
6 5 1 4
输出样例
17
说明
两人可以按照 (1,2,4,3) 的芯片编号顺序进行破译传输,所需时间为 17。
思路
优先选择能更快释放传输资源或减少后续等待的任务
关键,如何对整个队列进行排序
例如比较X,Y,谁该放前面
x.first代表破译x芯片需要的时间,x.second代表传输x芯片需要的时间
解密快但传输慢的芯片,解密慢但传输快的芯片
找到能尽快传输的
A解密时,B(如果已经解密)可以进行传输
也就是A,B的最小值,代表AB同时占用时间线的时间
AB同时占用时间线的时间的值越大,证明任务并行程度越高,资源利用率越高
所以比较每组的AB同时用时,采取同时用时最长的方法
总结
比较A(解密)B(传输)和B(解密)A(传输)的重叠时间,非重叠时间小的那个解密任务,往前放
这样能更快运行下一个解密任务
注意
Johnson流水线算法,无法保证排序的稳定性,有可能会有A要排B前面,B要排
Johnson流水线算法,可以保证排序的稳定性
情况一
如果A的解密时间,和传输时间,都低于B的传输时间,和解密时间
那优先解决A
情况二:A(5,2),B(1,3)
如果A的解密时间,大于B的传输时间,而A的传输时间,大于B的解密时间
此时大小,一定由B的传输时间和B的解密时间控制
如果B的传输时间大于B的解密时间
则先解密B,解密B后,在传输B的同时,解密A,最后传输A
此时传输B,解密A大于传输A,解密B
深度理解
看完样例情况,深度理解
min(解密A,传输B)的解,实际上是AB重复叠加,并行操作的最大值
min(解密A,传输B)和min(解密B,传输A)比较,实际上比较的是谁能并行处理的时间更长
min(解密A,传输B)代表的方案实际上是:首先解密B,然后传输B的同时解密A,然后传输A 方案1
min(解密B,传输A)代表的方案实际上是:首先解密A,然后传输A的同时解密B,然后传输B 方案2
传输B的同时解密A,他们的并行处理的时间是min(解密A,传输B),此为先B后A方案 方案1
传输A的同时解密B,他们的并行处理的时间是min(解密B,传输A),此为先A后B方案 方案2
初始状态A在B前面,初始为方案2
比较哪个方案的并行处理时间更长,选择更长的方案。
例如:min(解密A,传输B)<min(解密B,传输A),则采用传输A的同时解密B,也就是方案2,先A后B
例如:min(解密A,传输B)>min(解密B,传输A),则采用传输B的同时解密A,也就是方案1,先B后A
min里的是中间态,为并行操作最长时间
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
pair<int,int> p[N];
int res,t;
int pd(pair<int,int> x,pair<int,int> y){
return min(x.first,y.second)<min(y.first,x.second);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>p[i].first;
for(int i=1;i<=n;i++)cin>>p[i].second;
sort(p+1,p+1+n,pd);
for(int i=1;i<=n;i++){
res+=p[i].first;
if(res>=t)t=res+p[i].second;
else t=t+p[i].second;
}
cout<<t;
return 0;
}