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

蓝桥账户中心

输入样例

复制代码
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里的是中间态,为并行操作最长时间

cpp 复制代码
#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;
}
相关推荐
-程序猿小郭2 小时前
针对面试-redis篇
redis·面试·职场和发展
rigidwill6662 小时前
LeetCode hot 100—验证二叉搜索树
c++·算法·leetcode·职场和发展
wang__123002 小时前
力扣118,1920题解
算法·leetcode·职场和发展
ll7788113 小时前
C++学习之路,从0到精通的征途:stack_queue的模拟实现及deque原理介绍
开发语言·c++·笔记·学习·职场和发展
wuqingshun31415911 小时前
蓝桥杯 19. 植树
c++·算法·蓝桥杯·深度优先·动态规划
wang__1230013 小时前
力扣119题解
算法·leetcode·职场和发展
梁下轻语的秋缘14 小时前
每日c/c++题 备战蓝桥杯(P1886 滑动窗口 /【模板】单调队列)
c语言·c++·蓝桥杯
wuqingshun3141591 天前
蓝桥杯 17. 通电
c++·算法·职场和发展·蓝桥杯·深度优先·动态规划
jia_jia_LL1 天前
备战蓝桥杯国赛第一天-atcoder-beginner-contest404
c++·算法·蓝桥杯·图论
自由的风.1 天前
贪心算法解决会议安排问题
算法·贪心算法·c#