华为OD机试真题C卷-篇6

news2024/9/23 3:27:56

100分值题

  • 宽度最小的子矩阵
  • 部门人力分配
  • 电脑病毒感染
  • 会议室占用时间段
  • 路口最短时间问题
  • 5G网络建设

宽度最小的子矩阵

  • 给定一个n行 * m列的矩阵;
  • 给定一个k个整数的数组k_list;
  • 在n*m的矩阵中找一个宽度最小的子矩阵,该子矩阵包含k_list中所有的整数;
    输入描述:
    第一行输入n,m 两个整数;
    后续n行每行输入 m个数据;
    输入k值;
    输入个整数
    输出描述:
    最小宽度值,若找不到,则输出-1

示例1
输入:
2 5
1 2 2 3 1
2 3 2 3 2
3
1 2 3
输出:
2
说明,
矩阵第0、3列包含了1、2、3;
矩阵第3、4列包含了1、2、3

示例2
输入:
2 5
1 2 2 3 1
1 3 2 3 4
3
1 1 4
输出:
5
思路:

  • 滑动的子矩阵
  • 从第一列起始,找一个宽度最小的子矩阵;
  • 从第二列开始,找一个宽度最小的子矩阵;
  • 依次到最后一列…
  • 以上的宽度每次取最小值
 
class MinWidth:
    def solution(self, n, m, matrix, k_list):
        k_dict = self.to_dict(k_list)
        min_width = float("inf")
        # 类似双指针
        for start_idx in range(m):
            for end_idx in range(start_idx, m):
                temp_list = []
                # 获取当前子矩阵的所有元素
                for i in range(n):
                    temp_list.extend(matrix[i][start_idx:end_idx+1])
                temp_dict = self.to_dict(temp_list)
                # 集合操作
                flag = True
                for key in k_dict:
                    if key in temp_dict and k_dict[key] <= temp_dict[key]:
                        continue
                    else:
                        flag = False
                        break

                if flag:
                    min_width = min(min_width, end_idx - start_idx + 1)
                    break
        print(min_width)

    def to_dict(self, alist):
        dict_ = {}
        for i in alist:
            dict_[i] = dict_.get(i, 0) + 1
        return dict_


if __name__ == '__main__':
    min_width = MinWidth()

    while True:
        try:
            n, m = list(map(int, input().strip().split()))
            matrix = []
            for i in range(n):
                matrix.append(list(map(int, input().strip().split())))
            k = int(input().strip())
            k_list = list(map(int, input().strip().split()))
            min_width.solution(n, m, matrix, k_list)

        except KeyboardInterrupt:
            break

&nbsp

部门人力分配

  • requirements表示开发需求数组,每个值表示当前需求的月数,所有需求需要在m个月内完成;
  • 每个月最多有2个需求完成开发;人力安排后每个月人力是固定的;
  • 在满足需求开发进度的情况下,每个月需要的最小人力是多少?
    输入描述:
    第一行输入m
    第二行输入requirements 数组, 值>=1 长度为n;
    1<=n/2<=m<=n<=10000
    输出描述:
    输出部门需要的人力?

示例1
输入:
3
3 5 3 4
输出:
6
说明:
开发时间为5个月的需求在一个月内完成,则需要5个人;
3 3 合并到一个月完成,需要6个人力;
3 4合并到一个月完成,需要7个人力;
4 5合并到一个月完成,需要9个人力;

示例2
输入:
3
3 3 4 5 6
输出:
8

示例3
输入:
3
3 3 4 5 6 2
输出:

思路:

  • n个需求,n个月完成需要的人力较少,m个月完成人力增加;
  • n个需求在m个月内完成,当n==m时,取requirements的最大值;
  • n>m时,requirements升序排序,依次取出不需要合并的最大值放入temp_list,直到n==m的情况;
    • 剩余需要合并的数对,利用双指针进行两两合并(最大值组合一个最小值),求的和放入temp_list;
    • 最终 temp_list 长度会等于m,此时取temp_list的最大值即可;

class LeastResource:
    def solution(self, requirements, m):
        n = len(requirements)
        requirements.sort()
        temp_list = []
        if n == m:
            result = max(requirements)
            print(result)
        else:
            while n / 2 < m:
                temp_list.append(requirements.pop())
                n -= 1
                m -= 1
            # 剩余需求 需要两两组合
            self.merge(temp_list, requirements)
            result = max(temp_list)
            print(result)

    def merge(self, temp_list, requirements):
        cur_n = len(requirements)
        pre = 0
        cur = cur_n - 1
        while pre < cur:
            cur_sum = requirements[pre] + requirements[cur]
            temp_list.append(cur_sum)
            pre += 1
            cur -= 1


if __name__ == '__main__':
    least_resource = LeastResource()
    while True:
        try:
            m = int(input().strip())
            requirements = list(map(int, input().strip().split()))
            least_resource.solution(requirements, m)
        except KeyboardInterrupt:
            break

二分法
最小人力范围在requirements的最大值—最大值+次最大值 之间;


 
m = int(input())
nums = [int(x) for x in input().split(" ")]
nums.sort()
 
def cal(k, nums, length) :
    low = 0
    high = length - 1
    months = 0
    while (True) :
        if(low > high):
            break
        else :
            if (nums[low] + nums[high] > k) :
                high -= 1
            else :
                low += 1
                high -= 1
            
            months+=1
    return months
 
 
low = nums[len(nums)-1]
high = nums[len(nums)-1] + nums[len(nums)-2]
 
result = -1
while (True) :
    if(low > high):
        break
    else :
        k = int((low + high) / 2)
        if (cal(k, nums, len(nums)) <= m) :
            high = k - 1
            result = k
        else :
            low = k + 1
print(result)

 

电脑病毒感染

  • 一个局域网内有n台电脑,编号为 0 -> n-1,电脑之间病毒感染时间用t表示;
  • 现在网络内已有一台电脑被病毒感染;
  • 求其感染所有其他电脑最少的时间,若最后有电脑不会感染,则返回-1;
  • 数组times 表示一台电脑把相邻的电脑感染所用的时间;
  • path[i] = {i, j, t} 表示 电脑i 感染 电脑j 所用的时间t;
    输入描述:
    第一行输入n 在[1, 200]
    第二行输入m, 表示m条网络;
    后m行,每行输入i,j,t, 1<=i,j<=n
    最后一行输入携带病毒的电脑编号;
    输出描述:
    感染全部电脑的最少时间,不能感染全部输出-1

示例1
输入:
4
3
2 1 1
2 3 1
3 4 1
2
输出:
2

思路

  • 单源最短路径
 
n = int(input())
count = int(input())
time = [float('inf') for i in range(n)]
 
matrix=[[0 for i in range(3)] for j in range(count)]
for j in range(count):
    nums = [int(x) for x in input().split(" ")]
    matrix[j][0] = nums[0] 
    matrix[j][1] =nums[1]
    matrix[j][2] = nums[2]
 
start = int(input())
time[start-1] = 0
 
for i in range(n):
    for j in range(count):   
        if (time[matrix[j][0]-1] + matrix[j][2] < time[matrix[j][1]-1]) :
            time[matrix[j][1]-1] = time[matrix[j][0]-1] + matrix[j][2]
        
result = 0
i=0
while(True):
    if(i>=n):
        print(result)
        break
    else :
        if (time[i] == float('inf')) :
            print(-1)
            break
        
        if(time[i]>result):
            result = time[i]
    i+=1
 

 

会议室占用时间段

在这里插入图片描述
在这里插入图片描述

 
meetings = [[1,4], [2,5],[7,9], [14,18]]
def merge(meetings) :
    sorted(meetings,key=lambda x: (x[1],x[0]))
    result = []
    result.append(meetings[0])
    cur = result[0]
    i=1
    while(True):
        if(i>=len(meetings)):
            break
        else :
            if (cur[1] >= meetings[i][0] and cur[1] <= meetings[i][1]) :
                cur[1] = meetings[i][1]
            elif(cur[1] > meetings[i][1]):
                pass
            else :
                result.append(meetings[i])
                cur = meetings[i]
        i+=1
 
    print(result)
    return result
merge(meetings)

 

路口最短时间问题

在这里插入图片描述
在这里插入图片描述


directions = [[-1,0],[0,1],[1,0],[0,-1]]
 
def calcTime(lights, timePerRoad, rowStart, colStart, rowEnd, colEnd) :
    result = [[[float('inf') for i in range(4)] for j in range(colEnd+1)] for k in range(rowEnd+1)]
 
    pq = queue.PriorityQueue()
 
    for i in range(4):
        pq.put([0, [rowStart, colStart, i, 0]])
        result[rowStart][colStart][i] = 0
    
 
    while (True) :
        if(pq.qsize()<=0):
            break
        else :
            point_t = pq.get() 
            point = point_t[1]
            if (point[3] > result[point[0]][point[1]][point[2]]) :
                continue
            
            for  i in range(4):
                if (not(directions[i][0] == 1 and directions[i][1] == 0)) :
                    new_dir = (point[2] + i) % 4 
                    new_x = point[0] + directions[new_dir][0]
                    new_y = point[1] + directions[new_dir][1]
                    if (new_x >= 0 and new_x < len(lights) and new_y >= 0 and new_y < len(lights[new_x])) :
                        new_speed = point[3] + timePerRoad 
                        if (not(directions[i][0] == 0 and directions[i][1] == 1)):
                            new_speed += lights[point[0]][point[1]]
                          
                        if (new_speed < result[new_x][new_y][new_dir]) :
                            result[new_x][new_y][new_dir] = new_speed
                            pq.put([new_speed, [new_x, new_y, new_dir, new_speed]]) 
 
    return min(min(result[rowEnd][colEnd][0],result[rowEnd][colEnd][1]), result[rowEnd][colEnd][2]) 
 
lights = [[1,2,3],[4,5,6],[7,8,9]]
timePerRoad = 60
rowStart = 0
colStart = 0
rowEnd = 2
colEnd = 2
print(calcTime(lights,timePerRoad, rowStart,colStart, rowEnd, colEnd))

 

5G网络建设

  • 选取n个地点建设5G基站,地点编号1 -> n;
  • 各个基站之间使用光纤连接,设计算法计算连通所有基站的最小成本;
  • 基站的连通具有传递性,A->B连通,B->C连通,则A->C连通;
    输入描述:
    第一行输入基站个数n, 0< n <=20;
    第二行输入已具备光纤连接的基站对数m;
    第三行开始的m行,格式为 X Y Z P,X Y表示基站编号 1-n且不相等,Z表示XY之间的光纤成本(0, 100),P表示是否已存在光纤连接,0未连接,1已连接;
    输出描述:
    输出最小的建设成本,无法建设完成输出-1;

示例1
输入:
3
3
1 2 3 0
1 3 1 0
2 3 5 0
输出:
4
说明:只需在1、2及2、3之间建设光纤

示例2
输入:
3
1
1 2 5 0
输出:
-1

示例3
输入:
3
3
1 2 3 0
1 3 1 0
2 3 5 1
输出:
1

在这里插入图片描述


class UF:
    def __init__(self, n):
        self.root = [i for i in range(n+1)]
        self.rank = [1 for i in range(n+1)]
        self.count = 0
 
    def find(self,x):
        if (x == self.root[x]):
            return x
        
        self.root[x] = self.find(self.root[x])
        return self.root[x]
    
    def union(self,x, y):
        self.root[self.find(x)] = self.find(y)
        self.count+=1
    
    def get_count(self):
        return self.count
 
n = int(input())
m = int(input())
uf = UF(n)
networks = []
for i in range(m):
    data = [int(x) for x in input().split(" ")]
    
    if (data[3] == 1):
        if (uf.find(data[0]) != uf.find(data[1])):
            uf.union(data[0], data[1])
    else:
        networks.append([data[0],data[1],data[2]])
    
 
sorted(networks, key=lambda x : x[2])
 
result = 0
i=0
while(True):
    if(i>=len(networks)):
        break
    else:
        
        if (uf.find(networks[i][0]) != uf.find(networks[i][1])):
            uf.union(networks[i][0], networks[i][1])
            result += networks[i][2]
            
            if (uf.get_count() == n - 1):
                break
    i+=1
 
 
if(uf.get_count() != n - 1):
    result = -1 
print(result)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1488504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0到1全流程使用 segment-anything

从0到1全流程使用 segment-anything 一、安装 anaconda 一、下载 anaconda 二、以管理员身份运行安装 1、勾选 Just Me 2、统一安装路径(后续 python 等包也安装至此目录) 3、勾选 add to path 然后安装即可。 三、修改 Anaconda 默认路径及默认缓存路径 Anaconda 默认下…

反向代理多级多机

一 架构图 本次实验需要 5台机器 第一台 nginx 只做代理服务器 负责反向代理 加 负载均衡 后面的两台nginx 做真实服务器 处理静态资源 再后面的 tomcat 做真实服务器 处理动态资源 二 具体实验 &#xff08;一&#xff09; 具体实验环境 所有机器关闭防火墙 安装…

第一天 走进Docker的世界

第一天 走进Docker的世界 介绍docker的前世今生&#xff0c;了解docker的实现原理&#xff0c;以Django项目为例&#xff0c;带大家如何编写最佳的Dockerfile构建镜像。通过本章的学习&#xff0c;大家会知道docker的概念及基本操作&#xff0c;并学会构建自己的业务镜像&…

【性能测试】Jmeter性能压测-阶梯式/波浪式场景总结(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、阶梯式场景&am…

Spring中Bean的作用域、实例化方式、生命周期、循环依赖问题

Spring中Bean的作用域、实例化方式、生命周期、循环依赖问题 一、Bean的作用域1.singleton2.prototype3.其他scope值 二、Bean的实例化方式1.通过构造方法实例化2.通过简单工厂模式实例化3.通过factory-bean实例化4.通过FactoryBean接口实例化5.BeanFactory和FactoryBean的区别…

车载主机中控屏_车载平板电脑|车载后装定制方案

现代汽车已经成为人们生活中不可或缺的交通工具&#xff0c;车载中控屏作为汽车信息娱乐和导航系统的重要组成部分&#xff0c;更是受到了越来越多车主的重视。而一款优秀的车载主机中控屏&#xff0c;不仅需要具备强大的性能和功能&#xff0c;还需要具备高性价比和更低的耗电…

深入探索Java线程管理:Thread类的全面指南

&#x1f31f; 欢迎来到我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知&#xff0c;分享知识 &#x1f4ab; **&#x1f31f; 欢迎来到我的博客&#xff01; &#x1f308;****&#x1f4a1; 探索未知&#xff0c;分享知识 &#x1f4ab;**深入探索Java线程管理&…

前端监控为什么采用GIF图片做埋点?

一、什么是埋点监控 前端监控是开发人员用来跟踪和维护应用程序表现层的运行状况的过程和工具。它主要包括三种类型&#xff1a;数据监控、性能监控和异常监控。 1、数据监控 主要是为了收集跟用户相关的数据&#xff0c;例如用户设备类型、浏览器版本、页面浏览量&#xff08;…

【JavaScript】面试手撕浅拷贝

【JavaScript】面试手撕浅拷贝 引入 浅拷贝和深拷贝应该是面试时非常常见的问题了&#xff0c;为了能将这两者说清楚&#xff0c;于是打算用两篇文章分别解释下深浅拷贝。 PS: 我第一次听到拷贝这个词&#xff0c;有种莫名的熟悉感&#xff0c;感觉跟某个英文很相似&#xff…

2024全国护网行动HW行动招聘/收人!!!

2024全国护网行动HW行动招聘 溯蓉信创开始收人啦&#xff01;&#xff01;&#xff01;现在开始收录2024HW简历&#xff0c;感兴趣的小伙伴扫码二维码添加微信 我们签约后&#xff0c;入场即预付款3k&#xff0c;签约后我们会在HW之前对我们的人员进行HW培训&#xff0c;保证上…

光辐射测量(1)基本介绍+辐射度量、光辐射度量基础

基本情况&#xff1a;本门课就是对“三度学”进行学习。“三度学”包括辐射度学、光度学、色度学。主要掌握其基本概念、原理、物理量的互相转换关系、计算分析方法、测量仪器与测试计量方法等。 三者所覆盖的范围如图。 辐射度学&#xff1a; 辐射度学是一门研究电磁辐射能测…

TikTok矩阵获客软件开发需要了解的代码!

在数字营销领域&#xff0c;TikTok已经成为一个不可忽视的平台&#xff0c;由于其庞大的用户群体和高度互动性&#xff0c;越来越多的企业开始寻求在TikTok上进行有效的获客策略。 为了实现这一目标&#xff0c;开发一款针对TikTok的矩阵获客软件成为了许多企业的选择&#xf…

力扣刷题:206.反转链表

题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&am…

day11_oop_fianl_satic_多态

今日内容 零、 复习昨日 一、final 二、static 三、多态 四、向上转型&向下转型 五、多态应用 零、 复习昨日 0 类封装步骤 属性私有private提供setget方法 1 继承关键词,继承的好处 extends减少代码重复为多态做准备 2 子类可以使用父类什么 非私有的属性和方法 3 方法重写…

java数据结构与算法刷题-----LeetCode337. 打家劫舍 III

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 动态规划深度优先1.1 解题思路和细节2.2 代码实现 很多人觉得…

vue项目中使用antvX6新手教程,附demo案例讲解(可拖拽流程图、网络拓扑图)

前言&#xff1a; 之前分别做了vue2和vue3项目里的网络拓扑图功能&#xff0c;发现对antv X6的讲解博客比较少&#xff0c;最近终于得闲码一篇了&#xff01; 需求&#xff1a; 用户可以自己拖拽节点&#xff0c;节点之间可以随意连线&#xff0c;保存拓扑图数据后传给后端&…

恒峰|智能高压森林应急消防泵|森林防火的守护神

在大自然中&#xff0c;森林是生态系统的重要组成部分&#xff0c;它们为我们提供氧气、净化空气、保持水源、防止土壤侵蚀等重要功能。然而&#xff0c;森林火灾却时常威胁着这些宝贵资源的安全。为了应对这一挑战&#xff0c;我们研制出了一种名为“智能高压森林应急消防泵”…

游戏寻路之A*算法(GUI演示)

一、A*算法介绍 A*算法是一种路径搜索算法,用于在图形网络中找到最短路径。它结合了Dijkstra算法和启发式搜索的思想,通过综合利用已知的最短路径和估计的最短路径来优化搜索过程。在游戏自动寻路得到广泛应用。 二、A*算法的基本思想 在图形网络中选择一个起点和终点。维护…

OSPF 普通区域stub实验简述

1、OSPF 普通区域stub配置 实验拓扑图 r1: sys sysname r1 undo info enable int loopb 0 ip add 1.1.1.1 32 quit int e0/0/0 ip add 172.16.1.1 24 quit ospf 1 area 0.0.0.1 network 172.16.1.0 0.0.0.255 network 1.1.1.1 0.0.0.0 Stub 配置普通区域 ret r6: sys sysnam…

不愧是华为出来的,太厉害了...

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 实习去了博彦科技&#xff08;外包&#xff09;&#xff0c;做的…