HNUCM-天梯赛选拔赛

前言:题目暂未开放,所以只写了题目大概的要求,开放后会补上题目详情。

问题A:

题目概述:统计给出的字符串中的M和F并求比例。

思路:

根据给出样例数t进行循环,利用count函数统计字符串中的"M"和"F"进行解题即可。

代码:

while True:
    try:
        t = int(input())
        while t > 0:
            t -= 1
            strings = input().strip()
            m, f = strings.count('M'), strings.count('F')
            cnt = m + f
            print("%.2f %.2f" % (m / cnt, f / cnt))
    except:
        break

问题B:

题目概述:给出n个数,判断有多少个数是重复出现的。

思路:

解题时为了逻辑简单,使用了一个字典和一个列表,分别来存储答到的次数和可能迟到的名单;当然也可以只使用一个字典完成解题,只需要把逻辑稍微修改一下即可。

代码:

n = int(input())
nums = list(map(int, input().split()))
lis, name = dict(), list()
cnt = 0
for num in nums:
    k = lis.get(num, 0)
    if k != 0 and num not in name:
        cnt, _ = cnt + 1, name.append(num)
    lis[num] = k + 1
print(cnt)

问题C:

题目概述:统计字符串中有多少个"hnucm"(不区别大小写)。

思路:

将字符串所有字符转化成小写,然后使用count函数即可。

代码:

strings = input().lower()
print(strings.count("hnucm"))

问题D:

题目概述:A和B从同起点相向跑步,A每分钟跑a米,B每分钟跑b米,A每跑4分钟休息一分钟,B每跑3分钟休息一分钟,问n分钟A能赶超B多少次。操场长400米。

思路:

其实这题我也没太看懂,想着是先算两个人跑步的距离相减再除以操场长度这样先试一试,结果过了。应该是一道数学题,不过我数学不好。

代码:

n, a, b = map(int, input().split())
cnt_A, cnt_B, run_A, run_B = 0, 0, 0, 0
for i in range(1, n + 1):
    if cnt_A == 4:
        cnt_A = 0
    else:
        run_A, cnt_A = run_A + a, cnt_A + 1
    if cnt_B == 3:
        cnt_B = 0
    else:
        run_B, cnt_B = run_B + b, cnt_B + 1
print((run_A - run_B) // 400)

问题E:

题目概述:给一个矩阵,每一步可以遍历八个方向,问矩阵中存在多少个不完全相同的“520”序列,不存在“520”序列就输出“爱你无法说出口!”

思路:

从题目很容易看出来这是一道深度优先搜索的题目,注意搜索截至条件即可。

代码:

def dfs(x: int, y: int, index: int):
    global cnt
    if index == 3:
        cnt += 1
    else:
        for dx in range(-1, 2):
            for dy in range(-1, 2):
                if dx == 0 and dy == 0:
                    continue
                nx, ny = x + dx, y + dy
                if 0 <= nx < n and 0 <= ny < m and maze[nx][ny] == ch[index]:
                    # print(f"{ch[index]}:({nx}, {ny}) {index}")
                    dfs(nx, ny, index + 1)
 
 
n, m = map(int, input().split())
maze, ch, cnt = [input().strip() for _ in range(n)], ['5', '2', '0'], 0
# print(maze)
for i in range(n):
    for j in range(m):
        if maze[i][j] == '5':
            # print(f"5:({i}, {j})")
            dfs(i, j, 1)
print(cnt) if cnt != 0 else print("爱你无法说出口!")

问题F:

题目概述:同一时间给出多个作业,作业的所需时长不同,求最小的平均作业等待时间。

思路:

从题目很容易想到,这应该是在让我们选取一种作业调度的算法,来使平均等待时间最小;通过推理,不难发现题目应该是使用“短作业优先”的调度算法,来使平均等待时间最小;进行“短作业优先”的模拟即可。

代码:

n, time, cnt = int(input()), 0, 0
nums = sorted(list(map(int, input().split())))
for num in nums:
    cnt, time = cnt + time + num, time + num
# print(cnt)
print("%.2f" % (cnt / n))

问题G:

题目概述:有[1, 5, 10, 20, 50, 100]这几种面额的钱,问n块钱有几种找零方式。

思路:

仔细推敲题目,不难看出,这应该是一道动态规划的题目,并且是“数的划分”的变种。所以我们推算以后就能得到公式

maze[i][j] = maze[i][j - 1] if i - nums[j] < 0 else maze[i][j - 1] + maze[i - nums[j]][j]

这里引入了nums列表来减少二维列表的规模,降低空间和时间复杂度。

代码:

n = int(input())
nums = [0, 1, 5, 10, 20, 50, 100]
maze = [[0] * 7 for _ in range(n + 1)]
for i in range(7):
    maze[0][i] = 1
for i in range(n + 1):
    maze[i][1] = 1
# print(maze)
flag = True
for i in range(1, n + 1):
    for j in range(2, 7):
        maze[i][j] = maze[i][j - 1] if i - nums[j] < 0 else maze[i][j - 1] + maze[i - nums[j]][j]
print(maze[n][6])

(Tips:以下三题没ac,待题目开放,ac后更新,敬请谅解)

问题H:

待更新、、、、、、

问题I:

待更新、、、、、、

问题J:

待更新、、、、、、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值