蓝桥杯 破译密码 Johnson流水线贪心算法

发布于:2025-04-08 ⋅ 阅读:(18) ⋅ 点赞:(0)

蓝桥账户中心

输入样例

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;
}