HNUCM-蓝桥杯PythonB组寒假练习2

news/2024/11/18 18:33:20/

问题 A: 选房子

题目描述

栋栋和李剑已经大四了,想要出去找房子住。他们一共看中了n套房子。其中第i套房子已经住了ai个人了,它最多能住bi个人。栋栋和李剑想要住在一起,那么请问他们有几套可以选择的房子?

输入

输入的第一行为一个正整数T (T<=1000),代表一共有T组测试数据。

每组测试数据的第一行有一个正整数n (1<=n<=100),代表一共有n套房子。接下来n行,每行有两个正整数ai,bi (1<=ai<=bi<=100),分别代表现在已经住了ai个人和最多能住bi个人。

输出

对于每组测试数据,输出一行包含一个整数,代表他们可以选择房子的数量。

思路

简单的减法判断题,判断b - a 是否大于2即可。

代码

t = int(input())
while t > 0:t, n, cnt = t - 1, int(input()), 0for _ in range(n):a, b = map(int, input().split())if b - a >= 2:cnt += 1print(cnt)

问题 B: 倍数问题

题目描述

众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。

但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。

现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数

使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。

输入

第一行包括 2 个正整数 n, K。

第二行 n 个正整数,代表给定的 n 个数。

1 <= n <= 10^5, 1 <= K <= 10^3,给定的 n 个数均不超过 10^8。

输出

输出一行一个整数代表所求的和。

思路

题目可以使用枚举也可以使用动态规划(0-1背包)的思路进行解题,以下为枚举法。因为题目要求选取三个数,通过推理我们不难发现,在某一余数情况下,最多选取三个数,最少选取零个数。同时为了满足“最大"的要求,可以使用一个二维列表结合插入排序对输入进行处理,每个余数情况下,至多保留三个最大的数,以此降低题目规模。然后枚举三个数的余数,确定这三个数。

代码

while True:try:n, k = map(int, input().split())# remainder二维列表用来存储处理余数后的输入,res存储结果remainder, nums, res = [[0] * 3 for i in range(k)], list(map(int, input().split())), 0for num in nums:  # 使用插入排序,保证每个余数列表remainder[i]不会超过三个数,且存储的数为最大的三个数re = num % k  # 获取余数if num > remainder[re][0]:  # 插入排序remainder[re][0], remainder[re][1], remainder[re][2] = num, remainder[re][0], remainder[re][1]elif num > remainder[re][1]:remainder[re][1], remainder[re][2] = num, remainder[re][1]elif num > remainder[re][2]:remainder[re][2] = num# 枚举余数,获得三个数,三个数分别为a, b, cfor i in range(k):  # i代表a的余数for j in range(i, k):  # j代表b的余数z = (k - i + k - j) % k  # z代表c的余数a = remainder[i][0]  # 根据a的余数获得aif i == j:  # 如果a的余数和b的余数相同b = remainder[i][1]  # 根据b的余数获得bc = remainder[i][2] if i == z else remainder[z][0]  # 根据c的余数获得celse:  # 如果a的余数和b的余数不同b = remainder[j][0]  # 根据b的余数获得bc = remainder[i][1] if i == z else remainder[j][1] if j == z else remainder[z][0]  # 根据c的余数获得cif a + b + c > res:  # 比较,获得结果res = a + b + cprint(res)  # 输出结果except:break

问题 C: X星游戏

题目描述

X星人这几天很无聊,他发明了一个自娱自乐的小游戏。

现在有若干张写有0、1、2、3、......、9这10个数字之一的纸牌,每一次可以拿出一张牌。

将抽取到的牌中的数字连成一个数列,如果当前抽的牌中的数字在前面出现过,则收取这两张牌及其它们之间所有的牌。

请你编写一个程序,计算最多的一次可以收取到多少张牌?

【注:可能最后还留有一些牌没有被收取】

输入

单组输入。

第1行输入一个数字N,表示X星人总共抽取的牌数,N<=1000。

第2行输入N个数字,分别对应X星人每一次抽取到的纸牌上的数字,两两之间用空格隔开。

输出

输出最多一次可以收取到的牌的数量。

思路

简单的模拟题,模拟游戏的操作,对列表进行删除即可。

代码

def add(x: int, y: int):global res, indexres = max(res, y - x + 1)for i in range(y, x - 1, -1):del nums[i]index = xn, nums, index, res = int(input()), [int(i) for i in input().split()], 1, -1
while True:try:tmp = nums[index]if tmp in nums[:index]:add(nums[:index].index(tmp), index)else:index += 1except:break
print(res)

问题 D: 近似回文词

题目描述

输入一行文本,输出最长近似回文词连续子串。所谓近似回文词是指满足以下条件的字符串:

1. S以字母开头,字母结尾

2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符之后得到的串,b(S)是a(S)的逆序串。

比如当k=1时,Race cat是一个近似回文词,因为a(S)=racecat和b(S)=tacecar只有2个位置不同。

输入

输入包含不超过25组数据,每组数据包含两行。第一行是整数k(0<=k<=200),第二行为字符串S,包含不超过1000个字符(换行符不算)。S只包含字符、空格和其他可打印字符(比如逗号,句号),并且不会以空白字符开头。

输出

对于每组测试数据,输出最长近似回文子串的长度和起始位置(S的第一个字符是位置1)。如果有多个最长近似回文子串解,起始位置应尽量小。

思路

利用其他的列表存储源字符串的字母与下标信息,对字符串的字母进行回文串的判断(枚举中间位,分奇数与偶数两种长度情况)。

代码

cnt = 0
while True:try:cnt, k, buf = cnt + 1, int(input()), list(input().lower())n, p, ch, res = len(buf), [], [], -1# print(buf)for i in range(n):if buf[i].isalpha():p.append(i + 1), ch.append(buf[i])# print(buf, p, ch)f, n = 0, len(p)for i in range(n):err, j = k, 0while i - j >= 0 and i + j < n:if ch[i - j] != ch[i + j]:err -= 1if err < 0:breakt = p[i + j] - p[i - j] + 1if t > res:res, f = t, p[i - j]j += 1err, j = k, 0while i - j >= 0 and i + j + 1 < n:if ch[i - j] != ch[i + j + 1]:err -= 1if err < 0:breakt = p[i + j + 1] - p[i - j] + 1if t > res:res, f = t, p[i - j]j += 1print(f"Case {cnt}: {res} {f}")except:break

E: 最少硬币

题目描述

假设有4种硬币,它们的面值分别为1分、5分、10分和25分。

现在要找给顾客n分钱。

请问怎样找零钱才能使给顾客的硬币个数最少?

输出所需最少硬币的枚数。

输入

输入需要找给顾客的零钱n(单位:分)。

输出

输出所需最少硬币的枚数。

思路

经典的贪心问题,从最大的硬币开始找即可。

代码

money = [25, 10, 5, 1]
while True:try:n, cnt, index = int(input()), 0, 0while n > 0:if n >= money[index]:n, cnt = n % money[index], cnt + n // money[index]else:index += 1print(cnt)except:break

F: X星大学

题目描述

X星大学新校区终于建成啦!

新校区一共有N栋教学楼和办公楼。现在需要用光纤把这N栋连接起来,保证任意两栋楼之间都有一条有线网络通讯链路。

已知任意两栋楼之间的直线距离(单位:千米)。为了降低成本,要求两栋楼之间都用直线光纤连接。

光纤的单位成本C已知(单位:X星币/千米),请问最少需要多少X星币才能保证任意两栋楼之间都有光纤直接或者间接相连?

注意:如果1号楼和2号楼相连,2号楼和3号楼相连,则1号楼和3号楼间接相连。

输入

单组输入。

第1行输入两个正整数N和C,分别表示楼栋的数量和光纤的单位成本(单位:X星币/千米),N<=100,C<=100。两者之间用英文空格隔开。

接下来N*(N-1)/2行,每行包含三个正整数,第1个正整数和第2个正整数表示楼栋的编号(从1开始一直到N),编号小的在前,编号大的在后,第3个正整数为两栋楼之间的直线距离(单位:千米)。

输出

输出最少需要多少X星币才能保证任意两栋楼之间都有光纤直接或者间接相连。

思路

最短路径问题,可以采用对应的算法即可。

代码

N, C = map(int, input().strip().split(' '))
v = set()
load = []
cost = 0
uuu = N * (N - 1) // 2
while uuu > 0:uuu -= 1a, b, c = map(int, input().strip().split(' '))load.append((c, a, b))
load.sort()
# print(loads)
c, a, b = load.pop(0)
v.add(a)
v.add(b)
cost += c
while len(v) < N:for c, a, b in load:if (a in v and b not in v) or (a not in v and b in v):v.add(a)v.add(b)cost += cbreak# print(11)
# print(v)
print(cost * C)

G: 奖牌榜

题目描述

X星学校的运动会正在激烈进行中。

现在需要请你编写一个程序来显示所有班级的奖牌榜,显示规则如下:

(1) 优先按照金牌数量降序排列后显示。

(2) 如果金牌数相等则比较银牌数,银牌数多者显示在前。

(3) 如果金牌和银牌数都相等,则比较铜牌数,铜牌数多者显示在前。

(4) 如果金、银、铜数量均相等,则按照班级编号从小到大排列后显示。

(5) 需要按照班级编号、金牌数、银牌数、铜牌数、奖牌总数的顺序显示每个班级的奖牌情况。

已知X星学校的班级编号为一个四位正整数,且班级编号具有唯一性。

输入

单组输入。

第1行输入一个正整数N,表示班级的总数量,N<=9000。

接下来N行,每1行包含四个正整数,分别表示班级编号、金牌数、银牌数和铜牌数。金牌数、银牌数和铜牌数均小于100。两两之间用英文空格隔开。

输出

显示按照规则排序之后的奖牌榜,每一行都包含班级编号、金牌数、银牌数、铜牌数和奖牌总数,两两之间用英文空格隔开。

思路

使用sort函数结合lambda函数即可完成解题。

代码

n, t, box = int(input()), 0, []
while t < n:t += 1a, b, c, d = map(int, input().split())box.append((a, b, c, d))
box.sort(key=lambda x: [-x[1], -x[2], -x[3], x[0]])
for a, b, c, d in box:print(a, b, c, d, b + c + d)


http://www.ppmy.cn/news/12811.html

相关文章

C++11 std::function 基础用法

std::function是C11标准库中提供的一种可调用对象的通用类型&#xff0c;它可以存储任意可调用对象&#xff0c;如函数指针&#xff0c;函数对象&#xff0c;成员函数指针和lambda表达式。std::function类模板是一个类似于函数指针的类型&#xff0c;但它是可以处理任意可调用对…

内网穿透的概念及解决方案

1.什么是内网穿透 在外网的web请求可以转发到内网的本地服务 2.什么是内网&#xff1f;什么是外网&#xff1f; 内网(也叫局域网(Local Area Network&#xff0c;LAN))是在一个局部的地理范围内&#xff0c;一般可以是是几米内(比如家庭内网)&#xff0c;也可以是方圆几千米…

基于 TensorFlow 的深度学习图像识别模型的自动化测试(完整代码+数据)

任务目标: 针对深度学习图像识别模型的自动化测试框架,设计并实现一个 Python 实现的基于 TensorFlow 的深度学习图像识别模型的自动化测试方法,采用特定的方 式,根据提供的训练数据集和待测数据集,由待测数据集尽量生成使得模型出错但 是和原始数据“相似度”高的测试数据…

蓝桥云课 并查集练习题

蓝桥幼儿园 题目描述 蓝桥幼儿园的学生是如此的天真无邪&#xff0c;以至于对他们来说&#xff0c;朋友的朋友就是自己的朋友。 小明是蓝桥幼儿园的老师&#xff0c;这天他决定为学生们举办一个交友活动&#xff0c;活动规则如下&#xff1a; 小明会用红绳连接两名学生&…

Java寒假作业——问答题

Java寒假作业一、问答题&#xff08;26-50题&#xff09;26 解释进程和线程的区别进程和线程的区别主要包括&#xff1a;1&#xff09;线程的划分尺度小于进程&#xff0c;线程隶属于某个进程&#xff1b;2&#xff09;进程是程序的一种动态形式&#xff0c;是CPU、内存等资源占…

Vue缓存路由(keep-alive)以及新的生命周期

​ 一.概念 也就是说&#xff0c;kee-alive 是 Vue 内置的一个组件&#xff0c;可以使被包含的组件保留状态&#xff0c;或避免重新渲染 。也就是所谓的组件缓存 keep-alive 是 Vue 的内置组件&#xff0c;当它包裹动态组件时&#xff0c;会缓存不活动的组件实例&#xff0c;而…

C语言—基于realloc函数实现的通讯录

专栏&#xff1a;C语言 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些C语言的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 动态通讯录前言一、ContactInit初始化二、Contact…

JavaScript高级 ES6类

ES6类1. 认识class定义类2. 类和构造函数的异同3. 类的构造函数4. 类的实例方法5. 类的访问器方法6. 类的静态方法7. ES6类的继承8. super关键字9. 继承内置类10. 类的混入11. ES5 ES6 class 代码转换12. ES5 ES6 extends 代码转换13. JavaScript中的多态1. 认识class定义类 我…