当前位置: 首页 > news >正文

【华为上机真题 2022】流水线

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 测试样例

1.3.1 示例 1

二、解题思路

三、代码实现

四、时间复杂度


一、题目描述

工厂有 m 条流水线,用于并行完成 n 个独立的作业,工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。

现给定流水线个数 m,和需要完成的作业数 n,每个作业的处理时间分别为 t1、t2、...、tn。请编程计算处理完成所有作业的耗时为多少?

当 n > m 时,首先处理时间短的 m 个作业进入流水线,其他的等待,当某个作业完成时,依次从剩余作业中取处理时间最短的进入处理。

1.1 输入描述

第一行为 2 个整数(采用空格分隔),分别表示流水线个数 m 和作业数 n。

第二行输入 n 个整数(采用空格分隔),表示每个作业的处理时长 t1、t2、...、tn。

其中,0 < m,n < 100, 0 < t1,t2,...,tn < 100。

注:输入都是合法的。

1.2 输出描述

输出处理完所有作业的总时长。

1.3 测试样例

1.3.1 示例 1

输入

3 5
8 4 3 2 10

输出

13

说明:先安排时间为 2、3、4 的三个作业。

第一条流水线先完成作业,然后调度剩余时间最短的作业 8;

第二条流水线完成作业,然后调度剩余时间最短的作业 10;

总耗时就是第二条流水线完成作业的时间 13(3+10);

提示:每次将时间最短的那个任务,扔进当前有空的流水线里面处理。注意这个不是最优的调度方案。

二、解题思路

本题比较简单,主要是模拟流水线处理作业的流程,优先处理短作业。

先将所有作业排序,因为需要优先处理短作业。然后可以分两种情况处理:

(1)如果 m >= n,说明流水线个数大于作业的个数,每个作业可以分配到一个流水线上去,作业时间最长的处理完成后,所有作业都会处理完。所以最长时间即为需要时间最长的那个作业。

(2)如果 m < n,说明流水线个数小于作业的个数,需要按照每批次 m 个作业进行处理,根据作业的时间从短到长处理。这里假设 dp[ i ] 表示处理前 i 个作业需要的时间,那么,有如下动态方程:

dp[i] = dp[i] + dp[i - m];  i >= m

 上述公式表示处理前 i 个作业的时间为当前 i 作业的时间加上 dp[i - m] 需要的时间,因为有 m 个流水线,第 i 个作业一定放置在 i - m 个作业的流水线上。

三、代码实现

代码实现如下所示。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n, m;
    while (cin>>m>>n) {
        int val;
        vector<int>g;
        for (int i = 0; i < n; ++i) {
            cin>>val;
            g.push_back(val);
        }
        sort(g.begin(), g.end());
        if (m >= n) {
            cout<<g[n - 1]<<endl;
            continue;
        }

        for (int i = m; i < n; ++i) {
            g[i] = g[i] + g[i - m];
        }

        cout<<g[n - 1]<<endl;
    }
    return 0;
}

四、时间复杂度

时间复杂度:O(nlogn)

其中,n 表示任务的个数,在上述代码中,耗费的主要时间在于 sort 排序上,sort 排序的时间复杂度为 O(nlogn),所以总的时间复杂度为 O(nlogn)。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


相关文章:

  • Linux 将 /home 目录与 / 根目录磁盘合并
  • Docker数据卷自定义Docker镜像
  • 什么是多态?java 中实现多态的机制是什么?
  • Allegro如何使用快捷键快速切换层面操作指导
  • Qt-FFmpeg开发-音频解码为PCM文件(9)
  • JAVA毕业设计教工公寓管理计算机源码+lw文档+系统+调试部署+数据库
  • JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK9特性讲解】
  • 详解设计模式:访问者模式
  • Android -- 每日一问:你在Android开发中遇到的技术难题是什么,你是怎么解决的?
  • 思科防火墙NAT——实验
  • 基于非局部滤波图像去噪方法
  • Linux json-c使用
  • 实验7 数据库编程
  • 网络安全这玩意儿真不建议一般人学...
  • Cisco ASA应用——NAT的类型
  • 【译】JS基础算法脚本:字符串结尾
  • 分享的文章《人生如棋》
  • Apache Pulsar 2.1 重磅发布
  • download使用浅析
  • egg(89)--egg之redis的发布和订阅
  • java 多线程基础, 我觉得还是有必要看看的
  • java取消线程实例
  • python 学习笔记 - Queue Pipes,进程间通讯
  • vue学习系列(二)vue-cli
  • 入门级的git使用指北
  • 事件委托的小应用
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 再谈express与koa的对比
  • ​什么是bug?bug的源头在哪里?
  • #100天计划# 2013年9月29日
  • #162 (Div. 2)
  • #Linux(帮助手册)
  • #大学#套接字
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $.proxy和$.extend
  • (02)Hive SQL编译成MapReduce任务的过程
  • (Python第六天)文件处理
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (三)模仿学习-Action数据的模仿
  • (一)Dubbo快速入门、介绍、使用
  • (转)Oracle 9i 数据库设计指引全集(1)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • **PHP二维数组遍历时同时赋值
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET导入Excel数据
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [].slice.call()将类数组转化为真正的数组
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [2016.7 day.5] T2
  • [2669]2-2 Time类的定义
  • [Android Pro] Notification的使用
  • [AX]AX2012 SSRS报表Drill through action
  • [C++]指针与结构体
  • [C++进阶篇]STL中vector的使用