蓝桥杯 破译密码 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;
}
相关推荐
代码雕刻家11 小时前
2.4.蓝桥杯-分巧克力
算法·蓝桥杯
VT.馒头15 小时前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript
草履虫建模18 小时前
力扣算法 121. 买卖股票的最佳时机
算法·leetcode·职场和发展·贪心算法·动态规划·一次遍历
养军博客18 小时前
C语言五天速成(可用于蓝桥杯备考 难度中等偏下)
c语言·算法·蓝桥杯
爱尔兰极光18 小时前
LeetCode--有序数组的平方
算法·leetcode·职场和发展
闻缺陷则喜何志丹18 小时前
【栈 递归】P8650 [蓝桥杯 2017 省 A] 正则问题|普及+
c++·数学·蓝桥杯·递归·
iAkuya19 小时前
(leetcode)力扣100 58组合总和(回溯)
算法·leetcode·职场和发展
Warren9819 小时前
Pytest Fixture 作用域详解:Function、Class、Module、Session 怎么选
面试·职场和发展·单元测试·pytest·pip·模块测试·jira
爱尔兰极光19 小时前
LeetCode--移除元素
算法·leetcode·职场和发展
努力学算法的蒟蒻19 小时前
day73(2.1)——leetcode面试经典150
面试·职场和发展