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

华为OD机考双机位C卷 - 流水线(Java Python JS C/C++ GO )

最新华为OD机试

真题目录:点击查看目录

华为OD面试真题精选:点击立即查看

华为OD机考双机位C卷

题目描述

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

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

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

输入描述

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

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

0< m,n<100,0<t1,t2…tn<100。

注:保证输入都是合法的。

输出描述

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

示例1

输入

3 5 8 4 3 2 10

输出

13

说明

1、先安排时间为2、3、4的3个作业。
2、第一条流水线先完成作业,然后调度剩余时间最短的作业8。
3、第二条流水线完成作业,然后调度剩余时间最短的作业10。
4、总工耗时就是第二条流水线完成作业的时间13(3+10)。

解题思路

作业分配

  • 如果作业数n小于等于流水线数m,则每个作业直接分配给一条流水线,处理完的总时间就是所有作业的处理时间。

  • 如果作业数n大于流水线数m,则优先将处理时间最短的m个作业分配给各条流水线。

  • 对于剩下的作业,依次从处理时间最短的作业中选择,并将其分配到当前处理时间最短的流水线上。每分配一个作业,就将该流水线的总时间更新。

以示例输入为例,3条流水线,5个作业,处理时间为 [8, 4, 3, 2, 10]:

  1. 排序后的作业时间:[2, 3, 4, 8, 10]
  2. 分配前3个作业给流水线:
    • 流水线1:处理时间 2
    • 流水线2:处理时间 3
    • 流水线3:处理时间 4
  3. 作业完成情况:
    • 流水线1完成(时间2),进入下一个作业8(更新为10)。
    • 流水线2完成(时间3),进入下一个作业10(更新为13)。
  4. 最后计算所有流水线上时间的最大值,输出13。

Java

importjava.util.Arrays;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);// 输入流水线个数m和作业数nintnum_of_pipelines=scanner.nextInt();intnum_of_jobs=scanner.nextInt();// 输入每个作业的处理时长t1,t2...tnint[]job_times=newint[num_of_jobs];for(inti=0;i<num_of_jobs;i++){job_times[i]=scanner.nextInt();}// 对作业处理时长进行排序Arrays.sort(job_times);// 创建一个长度为流水线个数的数组,用于存储每条流水线的总时长int[]total_time=newint[num_of_pipelines];// 如果作业数小于等于流水线个数,直接将作业分配到每条流水线上if(num_of_jobs<=num_of_pipelines){total_time=job_times;}else{// 将处理时长最短的m个作业分配到每条流水线上total_time=Arrays.copyOfRange(job_times,0,num_of_pipelines);// 处理剩余的作业for(inti=num_of_pipelines;i<num_of_jobs;i++){intmin_time=Integer.MAX_VALUE;intindex=-1;// 找到处理时长最短的流水线for(intj=0;j<num_of_pipelines;j++){if(total_time[j]<min_time){min_time=total_time[j];index=j;}}// 将作业分配到处理时长最短的流水线上total_time[index]+=job_times[i];}}// 找到处理时长最长的流水线intmax_time=Integer.MIN_VALUE;for(inti=0;i<num_of_pipelines;i++){if(total_time[i]>max_time){max_time=total_time[i];}}// 输出处理完所有作业的总时长System.out.println(max_time);}}

Python

num_of_pipelines,num_of_jobs=map(int,input().split())# 流水线个数,作业数job_times=list(map(int,input().split()))# 每个作业的处理时间job_times.sort()# 按处理时间从小到大排序total_time=[]# 记录每个流水线的总耗时ifnum_of_jobs<=num_of_pipelines:# 如果作业数小于等于流水线个数total_time=job_times# 每个作业都分配到一个流水线else:total_time=job_times[:num_of_pipelines]# 先将处理时间最短的m个作业分配到流水线foriinrange(num_of_pipelines,num_of_jobs):# 处理剩余的作业min_time=min(total_time)# 找到当前总耗时最小的流水线index=total_time.index(min_time)# 找到最小耗时的流水线的索引total_time[index]+=job_times[i]# 将当前作业分配到最小耗时的流水线print(max(total_time))# 输出处理完所有作业的总耗时

JavaScript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letm,n;lettimes=[];rl.on('line',(line)=>{if(!m&&!n){[m,n]=line.trim().split(' ').map(Number);}elseif(times.length<n){times.push(...line.trim().split(' ').map(Number));}if(m&&n&&times.length===n){rl.close();constnum_of_pipelines=m;constnum_of_jobs=n;constjob_times=times;job_times.sort((a,b)=>a-b);lettotal_time=newArray(num_of_pipelines).fill(0);if(num_of_jobs<=num_of_pipelines){total_time=job_times;}else{total_time=job_times.slice(0,num_of_pipelines);for(leti=num_of_pipelines;i<num_of_jobs;i++){letmin_time=Infinity;letindex=-1;for(letj=0;j<num_of_pipelines;j++){if(total_time[j]<min_time){min_time=total_time[j];index=j;}}total_time[index]+=job_times[i];}}letmax_time=-Infinity;for(leti=0;i<num_of_pipelines;i++){if(total_time[i]>max_time){max_time=total_time[i];}}console.log(max_time);}});

C++

#include<iostream>#include<vector>#include<algorithm>using namespace std;intmain(){intnum_of_pipelines,num_of_jobs;cin>>num_of_pipelines>>num_of_jobs;vector<int>job_times(num_of_jobs);for(inti=0;i<num_of_jobs;i++){cin>>job_times[i];}sort(job_times.begin(),job_times.end());vector<int>total_time(num_of_pipelines);if(num_of_jobs<=num_of_pipelines){total_time=job_times;}else{total_time.assign(job_times.begin(),job_times.begin()+num_of_pipelines);for(inti=num_of_pipelines;i<num_of_jobs;i++){intmin_time=*min_element(total_time.begin(),total_time.end());intindex=distance(total_time.begin(),find(total_time.begin(),total_time.end(),min_time));total_time[index]+=job_times[i];}}cout<<*max_element(total_time.begin(),total_time.end())<<endl;return0;}

Go

packagemainimport("fmt""math""sort")funcmain(){varnumOfPipelines,numOfJobsint// 输入流水线个数m和作业数nfmt.Scan(&numOfPipelines,&numOfJobs)// 输入每个作业的处理时长t1,t2...tnjobTimes:=make([]int,numOfJobs)fori:=0;i<numOfJobs;i++{fmt.Scan(&jobTimes[i])}// 对作业处理时长进行排序sort.Ints(jobTimes)// 创建一个长度为流水线个数的数组,用于存储每条流水线的总时长totalTime:=make([]int,numOfPipelines)// 如果作业数小于等于流水线个数,直接将作业分配到每条流水线上ifnumOfJobs<=numOfPipelines{copy(totalTime,jobTimes)// 补齐剩余的流水线时间为0fori:=numOfJobs;i<numOfPipelines;i++{totalTime[i]=0}}else{// 将处理时长最短的m个作业分配到每条流水线上copy(totalTime,jobTimes[:numOfPipelines])// 处理剩余的作业fori:=numOfPipelines;i<numOfJobs;i++{minTime:=math.MaxInt32 index:=-1// 找到处理时长最短的流水线forj:=0;j<numOfPipelines;j++{iftotalTime[j]<minTime{minTime=totalTime[j]index=j}}// 将作业分配到处理时长最短的流水线上totalTime[index]+=jobTimes[i]}}// 找到处理时长最长的流水线maxTime:=math.MinInt32fori:=0;i<numOfPipelines;i++{iftotalTime[i]>maxTime{maxTime=totalTime[i]}}// 输出处理完所有作业的总时长fmt.Println(maxTime)}

C语言

#include<stdio.h>#include<stdlib.h>intcompare(constvoid*a,constvoid*b){return(*(int*)a-*(int*)b);}intmain(){intnum_of_pipelines,num_of_jobs;scanf("%d %d",&num_of_pipelines,&num_of_jobs);int*job_times=(int*)malloc(num_of_jobs*sizeof(int));for(inti=0;i<num_of_jobs;i++){scanf("%d",&job_times[i]);}qsort(job_times,num_of_jobs,sizeof(int),compare);int*total_time=(int*)malloc(num_of_pipelines*sizeof(int));for(inti=0;i<num_of_pipelines;i++){total_time[i]=(i<num_of_jobs)?job_times[i]:0;}if(num_of_jobs>num_of_pipelines){for(inti=num_of_pipelines;i<num_of_jobs;i++){intmin_time=total_time[0];intindex=0;for(intj=1;j<num_of_pipelines;j++){if(total_time[j]<min_time){min_time=total_time[j];index=j;}}total_time[index]+=job_times[i];}}intmax_time=total_time[0];for(inti=1;i<num_of_pipelines;i++){if(total_time[i]>max_time){max_time=total_time[i];}}printf("%d\n",max_time);free(job_times);free(total_time);return0;}

完整用例

用例1

3 5 8 4 3 2 10

用例2

2 4 5 6 7 8

用例3

4 6 1 2 3 4 5 6

用例4

1 3 10 20 30

用例5

5 5 1 2 3 4 5

用例6

10 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

用例7

6 10 10 9 8 7 6 5 4 3 2 1

用例8

7 8 1 2 3 4 5 6 7 8

用例9

4 15 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75

用例10

8 12 2 4 6 8 10 12 14 16 18 20 22 24

文章目录

  • 最新华为OD机试
  • 题目描述
  • 输入描述
  • 输出描述
  • 示例1
  • 解题思路
  • Java
  • Python
  • JavaScript
  • C++
  • Go
  • C语言
  • 完整用例
    • 用例1
    • 用例2
    • 用例3
    • 用例4
    • 用例5
    • 用例6
    • 用例7
    • 用例8
    • 用例9
    • 用例10

http://www.cnnetsun.cn/news/117122.html

相关文章:

  • 前沿速递 | Adv. Eng. Mater.:基于LPBF与压力渗透的FeSi2.9-Bakelite多功能复合材料设计与性能调控
  • Mermaid Live Editor 终极指南:实时图表编辑的完整解决方案
  • Drawnix白板工具:用代码思维重塑图形设计工作流
  • Monaco Editor代码提示响应优化实战指南
  • 下一代前端开发:用Next.js与大模型AI,零代码解锁你的智能助手
  • 跨越浏览器壁垒:Skyvern如何实现自动化脚本的通用兼容性
  • 应用现代化 | 金融智能风控的新标尺——《金融级智能应用能力要求 风控场景》标准正式发布
  • Undetectable接入亮数据代理ip做自媒体矩阵
  • 如何用lidR包3步完成激光雷达林业精准分析:从点云到决策的完整指南
  • 初识操作系统
  • Android端AI模型部署终极指南:从入门到精通
  • RuoYi-Vue3企业级管理系统:现代化开发框架实战指南
  • MCP协议驱动企业级AI集成:芋道源码的智能化升级实践
  • 终极指南:使用gsplat.js实现高性能3D高斯点云渲染
  • 把CNN和SVR捏在一起做预测这事儿,乍听有点玄乎,实操起来倒挺有意思。咱们今天不整那些虚头巴脑的理论,直接上手撸代码。先甩个模型结构出来镇楼
  • Memobase完整安装指南:构建AI长期记忆系统的7个关键步骤
  • Faiss HNSW性能瓶颈突破:5步诊断与3倍提速优化实战
  • 5个立竿见影的wgpu性能优化技巧:让你的Rust图形应用帧率翻倍
  • 1000 人并发 + 4K 高清,3 大行业案例见证协作效率翻倍
  • 字符串的拼接函数:strcat()
  • GraphRAG-Local-UI终极指南:本地知识图谱构建与智能查询完整教程
  • Messari:Flow 生态 2025 年 Q3 发展概览
  • Draft.js工具栏深度定制:构建企业级富文本编辑器的完整实践
  • 下一个版本EmotiVoice将带来哪些惊喜?
  • 明诺多功能全自动洗地机,适用于超市、地库及商场清洁需求
  • 最近网上爆火的Flowith AI是啥?能否成为下一代AI Agent产品?
  • CesiumJS体素渲染终极指南:3D体积数据可视化完整解析
  • LrcApi终极指南:快速构建专业级歌词同步服务的完整方案
  • DeepSeek-V3.2-Exp推理部署终极指南:从模型文件到生产服务的完整路径
  • CVAT用户权限配置完整教程:从基础到高级的团队协作管理终极指南