算法笔试-编程练习-H-02-24

w这套题,侧重模拟和题目理解,只要按照题目描述正常复现整体分数应该不错


一、数据重删

数据重删是一种节约存储空间的技术,通常情况下,在数据存储池内是有很多重复的数据库。重删则是将这些重复的数据块找出并处理的技术。简单地说重删,就是将NN份重复的数据快仅保留11份,并将N−1N−1份数据的地址指针指向唯一的那一份。

我们输入一串存储的数据,用NN表示数据个数,用KK标识号数据库的大小,设计一个方法判断当前数据块是否和前面的数据库有重复,两个数据库内容完全一样则表示重复。如果重复则将这个数据库删除,并且在第一个出现数据库的后面增加重复数据的计数,输出经过重复之后的内容。

解答要求

时间限制:C/C++1000msC/C++1000ms,其他语言 2000ms2000ms

内存限制:C/C++256MBC/C++256MB, 其他语言512MB512MB

输入

8输入数据的个数

2数据块的大小

1 2 3 4 1 2 3 4依次是数据值

输出

1 2 2 3 4 2输出结果为去除重复数据后的结果,输出结果最后没有空格,以数字结尾,输出内容不改变输入数据库的顺序

样例1

输入

8
2 
1 2 3 4 1 2 3 4

输出

1 2 2 3 4 2 

解释

总共8个数据,数据库的大小为2,按新窗口进行切片表示一个数据块,分别得到数据库为[1,2],[3,4],

[1,2],[3,4]其中第一个数据块和第三个数据块相同,第二个数据块和第四个数据块相同,可以分别进行重测,重测之后数据库[1,2]的计数变为2,表示有两个相同的数据块[1,2],同理[3,4]d的数据块计数性变为2

题目分析:

【题目类型:模拟】

这道题就按照题目描述模拟即可,处理输入的时候可能稍微麻烦点。

代码:

n = int(input())
data_size = list(range(int(input())))
DataBase = {}temp_in = input().split()
idx = -1
while idx < n:data_block = ""for j in data_size:idx += 1if idx < n:data_block += " " + temp_in[idx]data_block = data_block[1:]if len(data_block) > 0:if data_block not in DataBase.keys():DataBase[data_block] = 1else:DataBase[data_block] +=1ans = ""
for data in DataBase.keys():ans += data + " " + str(DataBase[data]) + " "
print(ans[:-1])

二、任务调度

题目内容

1.某Devops系统有一批并发任务需要匹配合适的执行机调度执行,任务和执行机都具有CPU型(用0表示)和IO型(用1表示)的区别,此外还有一种通用型执行机(用2表示),一批任务和执行机的类型分别用数组tasks、machines表示,tasks[i]表示第i个任务,machines[i]表示执行机的类型。每台CPU型、IO型执行机只能执行一个对应类型的任务,而通用型执行机既能执行CPU类型任务也能执行IO类型任务。

2.假设现有的匹配策略如下:任务需要按照优先级从高到低依次匹配执行机(i=0优先级最高),因此每一轮选择任务数组头部(i=0)的任务去匹配空置执行机数组头部(i=0)的执行机,若任务与执行机类型匹配,则代表该任务调度成功,把该执行机从空置执行机数组中移除。若任务与执行机的类型不匹配,则将执行机放到执行机数组尾部,循环该过程直到任务全部匹配成功或当前任务无法被所有剩余空置执行机匹配。

3.现规定任意时刻都可以选择使用通用执行机,但一旦选择将某个类型的任务匹配通用型执行机,则所有通用型机器都只能用于执行该类型的任务,为了避免任务排队阻塞,请返回现有匹配策略下剩下的最小空置执行机数量。

解答要求

输入

输入共3行 首行是一个正整数n,表示任务数量以及执行机数量

第2行包含n个整数,以空格分隔,表示为任务数组tasks

第3行包含n个整数,以空格分隔,表示为空置执行机数组machines

数据范围:1≤n≤100,0≤tasks[i]≤1,0≤machines[i]≤2.1≤n≤100,0≤tasks[i]≤1,0≤machines[i]≤2.

输出

一行一个整数,代表当前匹配策略下剩下的最小空置执行机数量。

样例1

输入

3
1 0 1
1 2 0

输出

0

题目分析:

【题目类型:模拟】

n的数量级不是很大,根据题目直接模拟即可,需要注意确认好循环终止的条件。

代码:

import copyn = int(input())
tasks = [int(i) for i in input().split()]
machines = [int(i) for i in input().split()]
machines_cnt = {0:0, 1:0, 2:0}
for i in machines:machines_cnt[i] += 1def calc(exchange):tasks_copy = copy.deepcopy(tasks)machines_copy = copy.deepcopy(machines)for idx in range(len(machines_copy)):if machines_copy[idx] == 2:machines_copy[idx] = exchangemachines_cnt_copy = copy.deepcopy(machines_cnt)machines_cnt_copy[exchange] += machines_cnt_copy[2]while len(tasks_copy) > 0:if tasks_copy[0] == machines_copy[0]:machines_cnt_copy[tasks_copy[0]] -= 1tasks_copy.pop(0)machines_copy.pop(0)else:if machines_cnt_copy[tasks_copy[0]] == 0:return len(machines_copy)else:while tasks_copy[0] != machines_copy[0]:machines_copy.append(machines_copy.pop(0))return 0print(min(calc(0), calc(1)))

三、亲和调度

题目内容

调度器上有一组将调度的任务(job),大部分任务之间存在亲和关系,需要优先把具有亲和关系的任务调度到同一个核上面,不亲和的任务不能运行在同一个核上面;

现在给定一组待调度的任务(任务编号和任务执行时间),同时会给出任务之间不存在亲和关系的列表(未给出的默认是亲和关系)。请设计一个调度器,按照如下要求:

1、找出一组包含亲和任务数量最多的亲和调度任务组;

2、如果规则1有多个解,给出所有任务执行时间之和最小的。并输出该亲和调度任务组的所有任务执行时间之和。

亲和调度任务组定义:一组可以在同一核上面执行的亲和任务集合

输入

首行是一个整数jobNum,表示任务数量,任务编号[1,jobNum],取值范围[1,30]

第二行jobNum个整数,表示每个任务的执行时间

第三行是一个整数mutexNum,表示不存在亲和关系的列表个数

接下来mutexNum行,每一行表示11对不亲和的任务编号,任务编号范围[1,jobNum]

输出

一个整数,表示所有任务的最短执行时间。

样例1

输入

3
2 3 10
1 
1 2

输出

12

解释:有3个待调度任务,任务1和任务2不亲和,不能在一个核上执行;

1.亲和调度任务组有:“任务1”“任务2”“任务3”,“任务1+任务3”,“任务2+任务3”;

2.包含任务数量最参的亲和调度任务组合有两种:“任务1+任务3”,或“任务2+任务3”;

3.两个任务的执行时间分别为12和13,选样执行时间较小的“任务1+任务3”,输出12。

样例2

输入

1
1
0

输出

1

解释:只有一个任务,返回这个任务的执行时间。

样例3

输入

3
2 3 10
3
1 2
2 3
1 3

输出

2

解释:有3个待调度任务,任务1和任务2、任务2和任务3、任务1和任务3不亲和,不能在一个核上执行;

1、亲和调度任务组有:“任务1”,“任务2”,“任务3”;

2、包含任务数量最多的亲和调度任务组合有33种:“任务1”,“任务2”,“任务3”;

3、3个场景的执行时间分别为2、3、10,选择执行时间较小的“任务1”,输出2。

题目分析

【题目类型:模拟、最大团、回溯法】

这个题目是个标准的最大团问题,有标准解法,即:Bron–Kerbosch 算法。但是如果之前没有了解过标准的解法,在考场上很难一下子写出标程,推荐用优化大模拟的方式拿尽量多的分数。

【模拟】

1)这道题模拟的方式也有很多种,最朴素的就是我们有n种任务,那么就存在2^n种组合,对于每种组合我们需要用O(n^2)的时间复杂度检验其是否是全联通的。

2)下面给出的模拟代码的逻辑是伴随着数据的输入,构造出m个约束下的所有可能性,同时计算每种行方法中,job的数量(time_list[-2])和时间花费time_list[-1]。这种方法最差情况下的时间复杂度是O(2^m)

【最大团回溯】

所谓团,就是一个完全图(图中任意两个节点都是联通的),题目所描述的目标就是找当前图中的最大团。

我们采用回溯的思想来实现本算法,输入两个形参R、P,R表示当前的团,P表示候选的点。在回溯过程中,我们只需要遍历候选点v,如果该点可以和R组成团,那么我们就把该点加入R中,并且从P中去除。当P中为空的时候,表明当前的R是个极大团,再判断他是否为最大团即可。

此外,还存在一些加速手段:在下一次回溯时,1)可以去除P中与当前候选v不联通的点;2)可以去除v之前的点(因为已经计算过了);3)如果R+P已经小于当前的最大团,就没有回溯的必要了。这种方法最差情况下的时间复杂度是O(2^n)

代码:


# 模拟
import copy
n = int(input())
time_list = [int(i) for i in input().split()]
time_list.append(n)
time_list.append(sum(time_list)-n)time_table = []
time_table.append(time_list)m = int(input())
for _ in range(m):i, j = map(int, input().split())i -= 1j -= 1idx = 0length = len(time_table)while idx < length:if time_table[idx][i] and time_table[idx][j]:time_table[idx][-2] -= 1temp = copy.deepcopy(time_table[idx])temp[-1] -= temp[j]temp[j] = 0time_table[idx][-1] -= time_table[idx][i]time_table[idx][i] = 0time_table.append(temp)idx += 1ans = [0, 0]
for tl in time_table:print(tl)if tl[-2] > ans[0] or (tl[-2] == ans[0] and tl[-1] < ans[1]):ans[0] = tl[-2]ans[1] = tl[-1]
print(ans[1])
# 最大团回溯
n = int(input())
G_Nodes = [int(i) for i in input().split()]# 构建有向图
G_Edges = [[True for _ in range(n)] for __ in range(n) ]
for i in range(n):G_Edges[i][i] = False
m = int(input())
for _ in range(m):i, j = map(int, input().split())i -= 1j -= 1G_Edges[i][j] = FalseG_Edges[j][i] = FalseCliqueCnt = 0
CliqueSum = 0
# 判断当前v加入clique后能否组成新的团
def checkClique(clique, v):# O(n)for c in clique:if not G_Edges[v][c]:return Falsereturn True# 构造新的候选集合P
def get_newP(P, v):# O(n)new_P = []for p in P:if G_Edges[v][p]:new_P.append(p)return new_Pdef maxClique(R, P):global CliqueCntglobal CliqueSum# 右 剪枝 1:不可能组和出现更大的团了if len(P) + len(R) < CliqueCnt:return# 终止条件 1if len(P) == 0:if len(R) > CliqueCnt:CliqueCnt = len(R)CliqueSum = sum(G_Nodes[idx] for idx in R)elif len(R) == CliqueCnt:temp = sum(G_Nodes[idx] for idx in R)if temp < CliqueSum:CliqueSum = tempreturnfor P_idx in range(len(P)):if checkClique(R, P[P_idx]):     # 如果 P[P_idx] 和 R 可以组成一个团new_R = R + [P[P_idx]]new_P = get_newP(P[P_idx:], P[P_idx])   # 右 剪纸 2:1)之前用的点不能作为候选点;2)当前点的不联通点不能作为候选点maxClique(new_R, new_P)returnmaxClique([], list(range(n)))
print(CliqueSum)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java:jdk8之后新增的时间API

文章目录 为什么要使用新增的API新增了哪些&#xff1f;Local常用方法代码一样的用法 黑马学习笔记 使用新增的 为什么要使用新增的API 新增了哪些&#xff1f; Local 常用方法 代码 package NewTime;import java.time.LocalDate;/*** Author: ggdpzhk* CreateTime: 2024-08-…

竞猜足球核心算法源码

需要实现的功能如下&#xff1a; 仅用于学习 竞猜足球核心算法源码 package com.lotterysource.portsadmin.service; import com.aliyun.oss.common.utils.DateUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.lotterysource.portsadmin.dbprovid…

@ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)

本文介绍如何使用应用ohos.systemParameterEnhance (系统参数)(系统接口)来控制设备硬件&#xff0c;可以通过它在系统中执行一段shell命令&#xff0c;从而实现控制设备的效果。接下来以一个实际的样例来演示如何通过它来控制设备以太网接口 开源地址&#xff1a;https://git…

链表OJ题——环形链表2

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 环形链表2 题目描述&#xff1a;在链表有环的基础上&#xff0c;找出环的入口点。 二、解题思路 三、解题代码

超实用的8个无版权、免费、高清图片素材网站整理

不管是设计、文章配图&#xff0c;还是视频制作&#xff0c;图片都至关重要。但是图片版权一直都是困扰很多设计、自媒体以及企业的大问题。现在&#xff0c;因为图片侵权被告的案例已经是司空见惯了&#xff0c;有的公众号甚至因为图片版权问题遭受致命打击。 1. Pexels Pexe…

(经验)SVN降版本,保留版本信息和用户信息。

背景&#xff1a;由于开始公司人数规模小&#xff0c;没有关心SVN最新版本免费对于用户数量限制要求不敏感&#xff0c;随着人数越来越多&#xff0c;公司来了新员工已经添加不了SVN需要注册码了&#xff0c;不利于SVN文件管理的在公司内部的推广。看了好多资料&#xff0c;都没…

信息学奥赛初赛天天练-75-NOIP2016普及组-完善程序-二分答案、二分查找、贪心算法、贪心策略

文章PDF链接: https://pan.baidu.com/s/1SVcGU_rApvoUWrUoviPCiA?pwdht2j 提取码: ht2j 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1 完善程序 (单选题 &#xff0c;每小题3分&#xff0c;共30分) 郊游活动 有 n名同学参加学校组织的郊游活动&#xff0c…

有没有比较好用的在线翻译工具?实力推荐这4款。

当我们面对外文资料时&#xff0c;可能需要翻阅厚重的词典&#xff0c;耗费大量的时间和精力。在翻译这方面&#xff0c;很多人都十分依赖翻译工具的&#xff0c;因为这些工具只需几秒钟就能给出翻译结果&#xff0c;提高了我们的学习和工作的效率。但是随着翻译工具越来阅读&a…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第八篇:Tab标签页的实现

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

使用C++封装顺序表

作业&#xff1a;使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 #include <iostream>using namespace std;using datatypeint; #define MAX 20struct SeqList { private: //私有datatype *data;int size0; …

【Java】数据类型与变量(二)

目录 3.变量 3.1什么是变量&#xff08;变量的概念&#xff09; 3.2语法格式 ​编辑​编辑3.3整型变量 3.3.1整型变量如何定义 ​编辑 3.3.2长整型变量 3.3.3短整型变量 3.3.4字节型变量 3.4浮点型变量 3.4.1双精度浮点型 3.4.2单精度浮点型 3.4.3单精度浮点型与双…

Google Search Console:完整教程

Google 提供了各种工具来收集和分析网站数据&#xff0c;其中最有价值的工具之一是 Google Search Console &#xff08;GSC&#xff09;。前身为 Google Webmaster Tools&#xff0c;它为 SEO 提供了对网站性能的宝贵见解。自 2015 年推出以来&#xff0c;该平台取得了长足的发…

关机软件项目规划

一、概述 1.1 编写目的 此项目开发规划书的编写主要是为《UPS SNMP卡网络监控系统》中配套使用的关机软件做主要的规划和整合&#xff0c;在开发过程中起到引导作用&#xff0c;以及给使用者提供简要的说明。 1.2 项目背景 关机软件是UPS网络监控适配器项目监控层的组成部分…

黑神化爆火,悟空的八十一难究竟用到了什么数据库?

九九八十一难&#xff0c;第一难。猿神&#xff0c;启动…然后发现先解压缩&#xff0c;后着色编译。就这姿势&#xff0c;这就是爆火的 《黑神话&#xff1a;悟空》单机游戏&#xff0c;哪怕是在工作日&#xff0c;大家仍纷纷涌入这个游戏世界。8月20日&#xff0c;万众瞩目的…

Excel表格合并后同步修改行号,删除重复项,按合并后的列进行排序

Excel合并单元格后每个合并后的行占据多列&#xff0c;如何进行排序 1、全选后选择合并选项中的取消合并单元格 2、选择删除重复项&#xff08;可以直接选定唯一行&#xff09; 3、可以发现合并后的每行占Excel的一行 4、然后制定排序规则 5、序号列下拉重排&#xff08;鼠标放…

智谱开源 CogVideoX-5B 视频生成模型,RTX 3060 显卡可运行;曝 OpenAI 模型「草莓」今秋推出

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Android Studio Koala下载并安装,测试helloworld.

1、下载&#xff1a; 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 2、滚动条拉到近最后&#xff0c;各个系统的下载地址&#xff1a; 3、下载完成以后&#xff0c;我们双击运行安装&#xff1a; 如果有路径要修改&#xff0c;则修改下就可以了&a…

【大模型系列篇】预训练模型:BERT GPT

2018 年&#xff0c;Google 首次推出 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;。该模型是在大量文本语料库上结合无监督和监督学习进行训练的。 BERT 的目标是创建一种语言模型&#xff0c;可以理解句子中单词的上下文和含义&…

新华三H3C HCL配置IS-IS基本配置

实验目标 完成本实验,应该能够达到以下目标。 ●掌握如何在路由器进行单区域IS-IS的基本配置 ●掌握如何在路由器上查看IS-IS路由表、邻居信息 ●掌握如何在路由器上查看IS-IS的LSDB信息 实验拓扑 IP地址表 实验任务 单区域配置&#xff1a; 在本实验任务中,需要在路由器上…

Dockerfile+私有仓库

使用Dockerfile创建应用镜像 在Docker file中定义所需要执⾏的指令&#xff0c;使⽤ docker build创建镜 像&#xff0c;过程中会按照dockerfile所定义的内容进⾏打开临时性容器&#xff0c;把docker file中命令全部执⾏完成&#xff0c;就得到了⼀个容器应⽤镜像&#xff0c;每…