自学内容网 自学内容网

2022-2023全国高校计算机能力挑战赛区域赛python组编程题

mi目录

2022

1.

2.

1. 使用 format() 方法

2. 使用 f-string(Python 3.6 及以上)

2023

1.

2.

3.

4


闽农大宝玲楼

2022

1.

1.某动物研究员给动物园的动物们定了一个园区幸福值,其中园区幸福值的计算为一个园区内“所有动物的活动时间总和”乘上“所有动物中最小的食量”。现在新引进了n只动物,园长准备建一个包含k只动物的“最幸福动物园区”,
如果从这n只动物中选择k只动物进入该园区,请问该园区的最高幸福值是多少?
输入格式:
第一行输入两个整数n,k,分别表示新引进的n只动物,与需要挑选的k只动物。(1 <= k <= n < 1000)
第二行输入n只动物各自的活动时间,以空格间隔。(1 <= <= 1000,单位分钟)
第三行输入n只动物各自的食量,以空格间隔。(1 <= <= 10000,单位克)
输出格式:
输出一个整数表示这k只动物的最大幸福值。2
输入样例1:

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

输入样例2:

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

输出样例1:
60
说明:选择第二只动物与第五只动物,幸福值为60

输出样例2:
120

非常baby难度的一题,对于这种没有复杂度要求的比赛,大胆利用好python的特有功能

求组合数的库。这题我的思路是把从n中抽取k个,我们可以先抽取索引值,然后根据索引值找时间和食量。

from itertools import combinations
input_data=list(map(int,input().split()))
n=input_data[0]
k=input_data[1]
t=list(map(int,input().split()))
e=list(map(int,input().split()))
x=[]
comb=list(combinations(range(n),k))
m=len(comb)
v=[]
tsum=0 #注意清零
flag=[]
for com in comb:
    tsum=0
    v=[] #同样的,注意清零
    for j in com:
        tsum+=t[int(j)]
        v.append(e[int(j)])
    ex=min(v)
    flag.append(tsum*ex)
result=max(flag)
print(result)

2.

快递行业的兴起慢慢的改变了人们的生活方式,越来越多的人选择了快递的方式。列表LA和列表LB中分别存放了一位快递小
哥今年9月份每天送件的单数和行车里程(公里)数,其中数值 - 1
表示该天休息,并未送件。
LA = [90, 114, -1, 110, 178, 115, 164, 155, 132, -1, 174, 153, 124, 189, 110, 145, -1, 160, 180, 139, 127, 129, 134, -1,
      160, 178, 150, 144, 145, -1]
LB = [87, 163, -1, 160, 184, 155, 169, 140, 129, -1, 190, 156, 141, 200, 115, 150, -1, 181, 190, 147, 120, 110, 120, -1,
      170, 167, 144, 135, 110, -1]
要求:计算并输出9月份该快递小哥出工日每天平均的送件单数和平均的行车里程数,结果保留2位小数。
输出格式:平均每天送件单数: ** *.**, 平均每天行车里程数: ** *.** (说明,输出字符串,精度为两位小数)
a=[90, 114, -1, 110, 178, 115, 164, 155, 132, -1, 174, 153, 124, 189, 110, 145, -1, 160, 180, 139, 127, 129, 134, -1,
      160, 178, 150, 144, 145, -1]
b=[87, 163, -1, 160, 184, 155, 169, 140, 129, -1, 190, 156, 141, 200, 115, 150, -1, 181, 190, 147, 120, 110, 120, -1,
      170, 167, 144, 135, 110, -1]
for i in range(len(a)):
    if i>=len(a):
        break
    if a[i]==-1:
        a.remove(a[i])
        b.remove(b[i])
x=sum(a)
t=len(a)
y=sum(b)
m=x/t
n=y/t
print("平均每天送件单数:""{:.2f}".format(m),",","平均每天行车里程数:","{:.2f}".format(n))

注意一下保留两位小数的写法,我这边是一种

1. 使用 format() 方法

number = 3.14159
formatted_number = "{:.2f}".format(number)
print(formatted_number)  # 输出: 3.14
2. 使用 f-string(Python 3.6 及以上)
number = 3.14159
formatted_number = f"{number:.2f}"
print(formatted_number)  # 输出: 3.14
给定两个正整数m、n(1<=m < n<=1000),请找出区间[m, n]中阿拉伯数字0~9出现的次数。比如[10, 12],0出现了1次,1出现了4次,2出现了1次,其余都是0次,输出时省略出现0次的数字。
输入格式: 
一行m与n两个正整数,空格间隔
输出格式:  按照0~9的顺序,每行单独输出每个数字出现的次数,数字与出现次数之间用冒号间隔
#输入样例1:
10 13
 输入样例2:
10 999

简单,就是把每次把个位取下来。

f=[0]*10
input_data=list(map(int,input().split()))
m=input_data[0]
n=input_data[1]

for i in range(m,n+1):
    j=i
    while(j):
        f[j%10]+=1
        j//=10
for i in range(10):
    if(f[i]!=0):
        print(f"{i}:{f[i]}")

注意j//10一定是整数除法

2023

1.

题目描述
小明在玩进阶版大富翁, 进阶版大富翁有特殊的步数计算方法。小明每次可以走的步数由一个公式决定。公式每个部分可以是一个整数或者一次数字抽奖 nds 。nds 表示, 在1到 s 中的整数中, 可以抽取 n 次,结果是你 n 次结果的和。总步数就是整个式子的结果。
如1+2d3,代表的就是1+2次在1到3之间抽取数字的结果。
结果最小值为三, 最大值为七。
现在题目中会给你一个字符串 s 表示步数的计算公式, 请你编写代码, 帮小明计算一下, 他可以走的步数的期望值是多少? (结果如果不是整数, 那么保留一位小数)。
输入输出格式
输入格式
一个字符串 s。
输出格式
一个整数。
输入输出样例1
输入
1+2d3
输出 5

利用python的异常检测。

然后就是期望值这里我们可以推导一下

\sum \frac{x_{i}}{s}=\frac{s+1}{2}

x=0
y=0
z=0
s=list(input().split('+'))
for i in range(len(s)):
    try:
        x+=int(s[i])

    except ValueError:
        y+=int(s[i][0])*int(s[i][2])
        z+=int(s[i][0])
sum=x+(y+z)//2
print(sum)

2.

给定两个字符串 text1 和text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列, 返回0。一个字符串的子序列是指这样一个新的字符串: 它是由原字符串在不改变字符的相对顺序的情况下删除某些字符 
(也可以不删除任何字符) 后组成的新字符串。
例如, ace 是 abcde 的子序列, 但 aec 不是 abcde 
的子序列。
两个字符串的公共子序列是这两个字符串所共同拥有的子序列。
输入格式
字符串。
输出格式
字符串。
输入/输出样例
输入1
lijiji,ijijij
输出1
4
说明/提示
· text1 和 text2 仅由小写英文字符组成。

可以考虑用动态规划,也可以求组合来解

from itertools import combinations
def getn(s):
    m=[]
    for i in range(len(s)+1):
        coms=list(combinations(s,i))
        for com in coms:
            m.append(''.join(com))
    return m
input_data=input().split(',')
s1=input_data[0]
s2=input_data[1]
str1=getn(s1)
str2=getn(s2)
num=[]
for st in str1:
    if st in str2:
        num.append(len(st))
if num:
    numx=sorted(num)
    print(numx[-1])
else:
    print(0)

 动态规划做法

input_data=input().split(',')
a=input_data[0]
b=input_data[1]
l1=len(a)
l2=len(b)

f=[[0]*(l2+1) for _ in range(l1+1)]
for i in range(1,l1+1):
    for j in range(1,l2+1):
        if a[i-1]==b[j-1]:
            f[i][j]=f[i-1][j-1]+1
        else:
            f[i][j]=max(f[i][j-1],f[i-1][j])
print(f[l1-1][l2-1])

3.

题目描述
左截断素数是不包含0 位的素数, 当连续删除第一个数字时, 结果始终为素数。
可右截断的素数是不包含 0位的素数, 当连续删除最后一位时, 结果始终为素数。
创建一个将整数作为参数的函数, 并且:
如果整数只是一个可左截断的素数, 则返回“left”。
如果整数只是一个可右截断的素数, 则返回“right”。
如果整数是两者, 则返回“both”。
否则, 返回 False。
输入输出格式
输入格式
输入一个整数;
输出格式
输出一个字符串, 表示输入整数的素数类型。
输入输出样例1
输入
9137
输出
left
解释 (可选)
因为 9137 137 37 7 都是质数。
输入输出样例2
输入
5939
输出
right
解释 (可选)
因为5939 593 59和5都是素数。
说明提示
输入整数不会超过10⁶,

利用好截断

def is_prime(n):

    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    for i in range(5, int(n ** 0.5) + 1, 6):
        if n % i == 0 or n % (i + 2) == 0:
            return False
    return True


def left_truncatable_prime(n):
    
    str_n = str(n)
    for i in range(len(str_n)):
        if not is_prime(int(str_n[i:])):  
            return False
    return True


def right_truncatable_prime(n):

    str_n = str(n)
    for i in range(len(str_n)):
        if not is_prime(int(str_n[:len(str_n) - i])):  
            return False
    return True


def truncatable_prime_type(n):
   
    is_left = left_truncatable_prime(n)
    is_right = right_truncatable_prime(n)

    if is_left and is_right:
        return "both"
    elif is_left:
        return "left"
    elif is_right:
        return "right"
    else:
        return False


num = int(input())
result = truncatable_prime_type(num)
print(result)
"""


4

最近, 小明去了一个古老的国家。在之前很长的时间里, 它都是世界上最富有、最强大的王国。因此, 这个国家的人民仍然非常自豪, 即使当他们的国家不再那么富有。
这个国家的商人每个人只卖一件商品, 
每件商品具有一定价值, 但如果你的钱低于一定金额, 他们会拒绝与你进行交易。
如果小明有一定单位的钱, 小明能得到的最大商品价值是多少?
输入输出格式
输入格式
第一行包含两个整数 N,M, 分别表示商品的数量和初始总金额。
接下来输入 N 行, 每行包含三个数字 P,Q,V, 分别表示每件商品的价格, 交易底线金额和商品的价值。
数字之间以空格间隔。
输出格式
针对输入, 打印出能得到的最大商品价值。
输入输出样例1
输入
2 10
10 15 10
5 10 5
输出
5

动态规划的背包问题n



input_data = list(map(int, input().split()))
n = input_data[0]  
m = input_data[1]  


p = [[0] * 4 for _ in range(n + 1)]  
f = [[0] * (m + 1) for _ in range(n + 1)]  


for i in range(1, n + 1):
    p[i] = list(map(int, input().split())) 

for i in range(1, n + 1):
    for j in range(0, m + 1):  # j 从 0 到 m
        if j < p[i][0]:  
            f[i][j] = f[i - 1][j] 
        elif j>p[i][0]:
            
            f[i][j] = max(f[i - 1][j], f[i - 1][j - p[i][0]] + p[i][2])
        else:
            f[i][j]=f[i-1][j]

print(f[n][m])

原文地址:https://blog.csdn.net/Niuma1122/article/details/143781599

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!