HNUCM蓝桥杯Python组寒假第二次练习

news2024/11/26 8:59:45

文章目录

  • 1316: 选房子
  • 2158: 倍数问题
  • 2196: X星游戏
  • 1034: 近似回文词
  • 1749: 最少硬币
  • 2079: X星大学
  • 2086: 奖牌榜
  • 总结:

1316: 选房子

1316: 选房子
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB

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

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

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

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

样例输入 Copy
2
2
1 2
1 3
3
1 10
2 10
3 10
样例输出 Copy
1
3
来源/分类
首届全国中医药院校大学生程序设计竞赛

分析:由题意得只要b-a>=2即可
代码:

n=int(input())
for i in range(n):
    m=int(input())
    count=0
    for j in range(m):
        a,b=map(int,input().split( ))
        if b-a>=2:
            count=count+1
    print(count)

2158: 倍数问题

2158: 倍数问题
[命题人 : 202001080138]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。
但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。
现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数
使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。
输入
第一行包括 2 个正整数 n, K。
第二行 n 个正整数,代表给定的 n 个数。
1 <= n <= 10^5, 1 <= K <= 10^3,给定的 n 个数均不超过 10^8。
输出
输出一行一个整数代表所求的和。
样例输入 Copy
4 3
1 2 3 4
样例输出 Copy
9
来源/分类
分析:利用插入排序最多保留同一个余数的前三大数,然后再利用cnt=(k-(i+j)%k)%k或者cnt=( 2*k-i-j) % k,两重循环得出满足条件的cnt,i,j三个数。细节如下:
代码:

n, k = map(int, input().split())
s = list(map(int, input().split()))
m = [[0 for i in range(3)] for i in range(k)] #只取同一个余数最大的前三个
for i, t in enumerate(s):# 插入交换
    if t in m[t % k]:
        continue
    if t >m[t%k][0]:
        m[t%k][0],m[t%k][1],m[t%k][2]=t,m[t%k][0],m[t%k][1]
    elif t>m[t%k][1]:
        m[t % k][0], m[t % k][1], m[t % k][2] = m[t % k][0],t, m[t % k][1]
    elif t > m[t % k][2]:
        m[t % k][0], m[t % k][1], m[t % k][2] = m[t % k][0], m[t % k][1], t
sum1 = 0
for i in range(k):
    if m[i][0] ==0:
        continue
    for j in range(k):
        if m[j][0] == 0:#如果第一个数为0则代表这个列表里面没有元素
            continue
        z = ( 2*k-i-j) % k#z=(k-(i+j)%k)%k也可
        sum2=0  #分为5种情况:
        if i == j and j != z and m[z][0] > 0 and m[i][0] >= 0:# i和j在一个余数列表里面,z不在,然后判断各自余数列表里面有没有这么多元素,没有就直接跳过,节约时间.
            sum2 =m[i][0] + m[i][1] + m[z][0]
        elif i == j and j == z and m[i][2] >0:#原理同上
            sum2 = m[i][0] + m[i][1] + m[j][2]
        elif i == z and j != z and m[i][1] >0 and m[j][0] > 0:
            sum2 =  m[i][0] + m[i][1] + m[j][0]
        elif i != j and j != z and z != i and m[i][0] > 0 and m[z][0] > 0 and m[j][0] > 0:
            sum2 =  m[i][0] + m[j][0] + m[z][0]
        elif j == z and i != z and m[j][1]>0 and m[i][0] > 0:
            sum2 = m[i][0] + m[j][0] + m[j][1]
        if sum2>sum1: #注意为了防止超时,最好不要用python自带函数max.
            sum1=sum2
print(sum1)

蓝桥云课AC截图
在这里插入图片描述

2196: X星游戏

2196: X星游戏
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
X星人这几天很无聊,他发明了一个自娱自乐的小游戏。
现在有若干张写有0、1、2、3、…、9这10个数字之一的纸牌,每一次可以拿出一张牌。
将抽取到的牌中的数字连成一个数列,如果当前抽的牌中的数字在前面出现过,则收取这两张牌及其它们之间所有的牌。
请你编写一个程序,计算最多的一次可以收取到多少张牌?
【注:可能最后还留有一些牌没有被收取】
输入
单组输入。
第1行输入一个数字N,表示X星人总共抽取的牌数,N<=1000。
第2行输入N个数字,分别对应X星人每一次抽取到的纸牌上的数字,两两之间用空格隔开。
输出
输出最多一次可以收取到的牌的数量。
样例输入 Copy
10
0 1 2 3 1 1 0 4 2 1
样例输出 Copy
4
提示
对于样例数据而言,最多收取4张牌,对应的数字序列是:1 2 3 1,即第2张牌到第5张牌。
来源/分类
分析:由题意模拟即可,用栈模拟也可。
代码:

def find(n,k):#从前面找到和n相同的数字的序号
    for i in range(len(k)-1,-1,-1):
        if k[i]==n:
            return i
def pick(a,b,k):#将a到b的值设为“p”
    for i in range(a,b):
        if k[i]!='p':
           k[i]="p"
def maxs(a,b,k):#计算a,b两张牌之间一共还有几张牌
    sum1=1
    for i in range(a,b):
        if k[i]!='p':
            sum1+=1
    return sum1
while True:
    n=int(input())
    s=list(map(int,input().split()))
    k=[]
    max1=0
    for t in s:#如果t不在列表,就加入
        if t not in k:
            k.append(t)
        else:
            index=find(t,k)#找到前面和t相同数字的序号
            max1=max(max1,maxs(index,len(k),k))#更新相同两张牌之间的最大数目
            pick(index,len(k),k)#将前面和数字t相同的数字到数字t给去掉,为了防止频繁的插入和删除超时,就直接将其值改为“p”
    print(max1)

1034: 近似回文词

1034: 近似回文词
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB

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

  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)。如果有多个最长近似回文子串解,起始位置应尽量小。

样例输入 Copy
1
Wow, it is a Race cat!
0
abcdefg
0
Kitty: Madam, I’m adam.
样例输出 Copy
Case 1: 8 3
Case 2: 1 1
Case 3: 15 8
来源/分类
湖南省第九届大学生计算机程序设计竞赛
分析:我用暴力模拟直接超时,oj只过了50%,然后在看到大佬的博客之后醍醐灌顶,以后遇到这类问题再也不怕超时了。思路:先记录字母和其序号,然后再以i为回文串的中心,以j为回文串的半径循环枚举,如果有k个不同就直接退出,进入下轮循环。注意要区分字符串长度的奇偶,细节如下:
代码:

cnt = 0
while True:
    try:
        cnt += 1
        k = int(input())
        p = input()
        maxlen, index = 0, 0
        s=[]
        sign=[]
        for i, t in enumerate(p):#记录字母和其序号,并将字母全部变为小写
            if t.isalpha():
                sign.append(i)
                s.append(t.lower())
        for i in range(len(s)):#以i为中心
            j, count = 0, 0
            while i + j < len(s) and i - j >= 0:#以j为半径的回文字符串,偶数情况下
                if s[i + j] != s[i - j]:#如果两边不等就记录+1
                    count += 1
                if count > k:#
                    break
                j += 1
            j-=1# 因为j退出时多加了1
            if sign[i + j] - sign[i - j]+1 > maxlen:#sign[i + j] - sign[i - j]+1,+1是因为列表是从下标为0开始的
                maxlen = sign[i + j] - sign[i - j] + 1
                index = sign[i - j]#记录开始的点
            j, count = 0, 0
            while i + j + 1 < len(s) and i - j >= 0:#奇数情况,其他同上
                if s[i + j+1] != s[i - j]:
                    count += 1
                if count > k:
                    break
                j += 1
            j-=1
            if j<0:continue
            if sign[i + j+1] - sign[i - j]+1 > maxlen:
                maxlen = sign[i + j+1] - sign[i - j] + 1
                index = sign[i - j]
        print('Case %d: %d %d'%(cnt, maxlen, index+1))
    except:
        break

AC截图:
在这里插入图片描述

1749: 最少硬币

1749: 最少硬币
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
假设有4种硬币,它们的面值分别为1分、5分、10分和25分。
现在要找给顾客n分钱。
请问怎样找零钱才能使给顾客的硬币个数最少?
输出所需最少硬币的枚数。
输入
输入需要找给顾客的零钱n(单位:分)。
输出
输出所需最少硬币的枚数。
样例输入 Copy
8
10
63
样例输出 Copy
4
1
6
来源/分类
算法分析与设计 贪心
分析:可以直接贪心从最大的硬币名额遍历求得最少硬币的枚数,也可以采用dp算法时效性最好。
dp算法:

while True:
    n=int(input())
    s=[1,5,10,25]
    m=[0 for i in range(n+1)]
    def solve():
        for i in range(n+1):
            m[i]=float("inf")
        m[0]=0
        for j in range(4):
            for i in range(s[j],n+1):
                m[i]=min(m[i],m[i-s[j]]+1)#滚动数组
    solve()
    print(m[n])

在这里插入图片描述

贪心算法:

k=[25,10,5,1]
while True:
      count=0
      n=int(input())
      for i in range(4):
            z=0
            if n>=k[i]:
                  z=n//k[i]
                  n=n-z*k[i]
                  count=count+z
            else:
                  continue
      print(count)

在这里插入图片描述

2079: X星大学

2079: X星大学
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
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星币才能保证任意两栋楼之间都有光纤直接或者间接相连。
样例输入 Copy
3 10
1 2 5
1 3 6
2 3 7
样例输出 Copy
110
来源/分类
分析:可以采用prime算法最小生成树,这里采用并查集,利用路径压缩优化查询。
代码:

def init(n, k):#初始化并查集,每个人得祖先是自己
    for i in range(1, n + 1):
        k[i] = i
    return k
def find(x, k):#递归寻找祖先
    if x != k[x]:
        k[x] = find(k[x],k)
    return k[x]
def union(x, y, k):#合并,指向同一个祖先
    x = find(x,k)
    y = find(y,k)
    if x != y:
        k[x] = k[y]
while True:
    n, c1 = map(int, input().split())
    k = [[] for i in range(n + 1)]
    init(n, k)
    sum1 = 0
    w = [[] for i in range((n * (n - 1) // 2))]
    for i in range(n * (n - 1) // 2):#列举路径数
        a, b, c = map(int, input().split())
        w[i].append(a)
        w[i].append(b)
        w[i].append(c)
    w.sort(key=lambda x: x[2], reverse=False)#将路径小的排前面
    for t in w:
        x, y, z = t[0], t[1], t[2]
        x1 = find(x, k)#寻找两个的祖先
        y1 = find(y, k)
        if x1 != y1:#不同则合并指向同一个祖先
            union(x, y, k)
            sum1 += z
    print(sum1*c1)

2086: 奖牌榜

2086: 奖牌榜
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
X星学校的运动会正在激烈进行中。
现在需要请你编写一个程序来显示所有班级的奖牌榜,显示规则如下:
(1) 优先按照金牌数量降序排列后显示。
(2) 如果金牌数相等则比较银牌数,银牌数多者显示在前。
(3) 如果金牌和银牌数都相等,则比较铜牌数,铜牌数多者显示在前。
(4) 如果金、银、铜数量均相等,则按照班级编号从小到大排列后显示。
(5) 需要按照班级编号、金牌数、银牌数、铜牌数、奖牌总数的顺序显示每个班级的奖牌情况。
已知X星学校的班级编号为一个四位正整数,且班级编号具有唯一性。

输入
单组输入。
第1行输入一个正整数N,表示班级的总数量,N<=9000。
接下来N行,每1行包含四个正整数,分别表示班级编号、金牌数、银牌数和铜牌数。金牌数、银牌数和铜牌数均小于100。两两之间用英文空格隔开。
输出
显示按照规则排序之后的奖牌榜,每一行都包含班级编号、金牌数、银牌数、铜牌数和奖牌总数,两两之间用英文空格隔开。
样例输入 Copy
4
1000 4 10 5
1001 5 11 6
1002 4 11 4
1003 4 10 5
样例输出 Copy
1001 5 11 6 22
1002 4 11 4 19
1000 4 10 5 19
1003 4 10 5 19
来源/分类
分析:多维数组排序,细节见:python如何自定义排序
代码:

while True:
    n=int(input())
    s=[]
    for i in range(n):
        s.append(list(map(int,input().split())))
    s.sort(key=lambda x:(x[1],x[2],x[3],-x[0]),reverse=True)
    for i in range(n):
        s[i].append(sum(s[i][1:]))
        for j in range(5):
            if j!=0:
                print(" ",end="")
            print(s[i][j],end="")
        print()

总结:

代码写的比较烂,各位大佬多多指教

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

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

相关文章

UDS诊断系列介绍13-31服务

本文框架1. 系列介绍1.1 31服务概述2. 31服务请求与应答2.1 31服务请求2.2 31服务正响应2.3 31服务否定响应3. Autosar系列文章快速链接1. 系列介绍 UDS&#xff08;Unified Diagnostic Services&#xff09;协议&#xff0c;即统一的诊断服务&#xff0c;是面向整车所有ECU的…

”凌寒独自开“绽放不一样的自己

目录 1&#xff1a;介绍 2&#xff1a;细节介绍 ​编辑 3&#xff1a;范例演示 4&#xff1a;平台助力 5&#xff1a;冲冲冲 1&#xff1a;介绍 每一个程序员都有一个产品的梦想&#xff0c;在独自开&#xff0c;每一位开发者为自己写代码。 毕竟谁又想错过每一个展示自…

CSDN网站勋章获取介绍

持之以恒&#xff1a;已下线&#xff0c;目前无法获取 签到勋章&#xff1a;签到新秀、签到达人、签到王者都已下线&#xff0c;目前无法获取 分享勋章&#xff1a;分享学徒、分享小兵、分享达人、分享精英、分享宗师、分享王者、至尊王者都已下线&#xff0c;目前无法获取 …

Git Extensions的安装与使用

一&#xff0c;介绍&#xff1a; Git Extensions是一个工具包&#xff0c;旨在使Windows下的Git更直观。 功能 Git的Windows资源管理器集成 功能丰富的Git用户界面 32位和64位支持 二&#xff0c;安装 csdn下载地址 GitExtensionhttps://download.csdn.net/download/weixin…

前端面试当中 js原型及原型链常考知识点

一、构造函数 讲原型则离不开构造函数&#xff0c;让我们先来认识下构造函数。 1.1 构造函数分为 实例成员 和 静态成员 让我们先来看看他们分别是什么样子的。 实例成员&#xff1a; 实例成员就是在构造函数内部&#xff0c;通过this添加的成员。实例成员只能通过实例化的…

【MyBatis】第三篇:传递参数

前面聊了一些配置文件的标签意义&#xff0c;在实例演示的时候&#xff0c;发现用的sql都是定死的&#xff0c;也就是无法传递参数&#xff0c;这个不符合开发的环境的&#xff0c;毕竟程序是需要交互的&#xff0c;自然也会有参数传递&#xff0c;下面依次进行演示。 在映射文…

一个注解(优雅)搞定SpringBoot项目中的身份证号、手机号等敏感数据脱敏

&#x1f4de; 文章简介&#xff1a;一个注解搞定身份证号、手机号等敏感数据脱敏处理 &#x1f4a1; 创作目的&#xff1a;公司中CRM的第一版快封版了&#xff0c;基本功能都落实了。接下来就是预防等保了&#xff0c;我负责的是核心业务客户模块这里自然有很多数据要做脱敏。…

【十 三】Netty 私有协议栈开发

Netty 私有协议栈开发私有协议介绍跨节点通信私有协议栈设计私有协议栈的网络拓扑图协议栈功能描述协议的通信模型消息体定义消息定义表私有协议消息头定义私有协议支持的字段类型私有协议的编解码规范私有协议的编码私有协议的解码链路的建立客户端握手请求握手请求消息定义服…

智能上线阻断的算法和实践

一、背景 上线是引起系统故障的主要原因之一&#xff0c;在有些公司甚至能占到故障原因的一半&#xff0c;及时地发现并阻断、回滚存在故障隐患的上线&#xff0c;可以有效地减少系统故障。 事实上&#xff0c;现在很多平台已经提供了基于手工配置规则来进行变更阻断的能力。…

Modern C++ | 谈谈万能引用以及它的衍生问题:将亡值、引用折叠和完美转发

文章目录前言左右值引用的铺垫万能引用&&引用折叠完美转发前言 在学习Linux系统编程的过程中&#xff0c;想着得到了新知识&#xff0c;不能把旧知识忘了啊&#xff0c;所以我就读起了以前写的博客&#xff0c;在Modern C介绍这篇博客中&#xff0c;关于完美转发只是介…

安科瑞智能仪表在密集母线行业中的应用

安科瑞 华楠AMB100智能母线监控系列系统示意图功能1.电压、电流、频率、有功功率、无功功率、功率因数、有功电能、无功电能、2-63次谐波、温度、湿度、漏电流等电参量测量&#xff1b;2.交流2DI、2DO&#xff0c;直流4DI、2DO&#xff1b;3.可信号取电或者独立辅助电源供电&am…

windows安装VMware最新版本(VMware Workstation 17.0 Pro)详细教程

目录 一、概述 二、下载 VMware Workstation 17.0 Pro 三、安装 VMware Workstation 17.0 Pro 四、创建一个空的虚拟机 一、概述 VMware Workstation Pro™ 是一个运行在window或Linux系统的软件&#xff0c;使开发人员能够在同一台 PC 上同时运行多个基于 x86 的 Windows、Li…

国内最全的Spring Boot系列之六

在新的一年祝大家兔年大吉&#xff0c;兔耳冲天&#xff0c;动如脱兔! 2022年就这么过去了&#xff0c;闭上眼回首2022年发生的事情&#xff0c;犹如过眼云烟 —— 一事无成的感觉。 2022年到底都发生了什么事情&#xff0c;坚持了什么&#xff1f;于是我闭上眼睛&#xff0c…

2023-1-16 刷题情况

子相似性 III 题目描述 一个句子是由一些单词与它们之间的单个空格组成&#xff0c;且句子的开头和结尾没有多余空格。比方说&#xff0c;“Hello World” &#xff0c;“HELLO” &#xff0c;“hello world hello world” 都是句子。每个单词都 只 包含大写和小写英文字母。…

K8s 如何通过 ConfigMap 来配置 Redis ?

1、创建 ConfigMap YAML 配置文件 cat <<EOF >./example-redis-config.yaml apiVersion: v1 kind: ConfigMap metadata:name: example-redis-config data:redis-config: "" EOF2、创建 ConfigMap 资源 kubectl apply -f example-redis-config.yaml创建完成…

VMware 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作的解决方法

在电脑上安装VMWare&#xff0c;运行虚拟机发现提示无法执行64位操作。本人系统是windows10,64位系统。错误提示&#xff1a; 已将该虚拟机配置为使用 64 位客户机操作系统。但是&#xff0c;无法执行 64 位操作。 此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态…

HTML的body元素

&#xff08;1&#xff09;HTML的body元素 body是一个简单的HTML稳定最基本的必需元素。 <body> 标签定义文档的主体。 <body> 元素包含文档的所有内容&#xff08;比如文本、超链接、图像、表格和列表等等&#xff09;。 &#xff08;2&#xff09;HTML 网页结…

HTML零基础教程,九大知识点带你玩转前端(上)

博主&#xff1a;冰小九&#xff0c;新人博主一只&#xff0c;欢迎大佬前来指导 冰小九的主页喜欢请给个三连加关注呀&#xff0c;谢谢&#x1f337;&#x1f337;&#x1f337;三连加关注&#xff0c;追文不迷路&#xff0c;你们的支持就是我最大的动力&#xff01;&#xff0…

【自学Docker 】Docker管理命令大全(上)

文章目录Docker create命令Docker create命令概述Docker create命令语法Docker create命令参数列表案例创建容器运行容器Docker create命令总结Docker exec命令Docker exec命令概述Docker exec命令语法Docker exec命令参数列表案例查看文件创建文件进入容器Docker exec命令总结…

Dubbo 自适应SPI

Dubbo 自适应SPI 1. 原理 在 Dubbo 中&#xff0c;很多拓展都是通过 SPI 机制进行加载的&#xff0c;比如 Protocol、Cluster、LoadBalance 等。有时&#xff0c;有些拓展并不想在框架启动阶段被加载&#xff0c;而是希望在拓展方法被调用时&#xff0c;根据运行时参数进行加…