第三届大学生算法大赛(通过率高于20%部分)

A题 新版贪吃蛇(通过率24.79%)

题目描述:

解题思路:

读取输入

  • 第一行输入一个整数 T,表示测试用例的数量。

  • 对于每个测试用例,第一行输入一个整数 n,表示方格的边长。

  • 第二行输入一个字符串,表示小蛇的操作指令串。

初始化变量

初始化 x 和 y 坐标,初始位置为 (0, 0),对应方格内的 0 号格子。

处理指令

遍历输入的所有指令,并根据指令更新 x 和 y 的值:

  • "UP":y 坐标减1;

  • "DOWN":y 坐标加1;

  • "LEFT":x 坐标减1;

  • "RIGHT":x 坐标加1;

计算最终位置的编号

根据二维坐标 (x, y) 计算对应的编号,使用公式 n * y + x 来计算格子的编号。

输出结果

对于每个测试用例,输出计算得到的最终位置的编号。

 代码实现:

# 使用int(input())获取一个整数,表示测试用例的数量。使用range函数创建一个迭代次数等于该数量的循环。
for _ in range(int(input())):
    # 获取每个测试用例中移动指令的数量,并将其转换为整数。
    n = int(input())
    # 读取一行输入,并按照空格分割成列表lt。这行输入包含了移动指令序列。
    lt = input().split()
    
    # 初始化x和y坐标,它们都从0开始。
    x, y = 0, 0
    
    # 遍历列表lt中的每一个元素(移动指令)。
    for i in lt:
        # 如果指令是"UP",则y坐标减1。
        if i == 'UP':
            y -= 1
        # 如果指令是"DOWN",则y坐标加1。
        elif i == "DOWN":
            y += 1
        # 如果指令是"LEFT",则x坐标减1。
        elif i == "LEFT":
            x -= 1
        # 否则,如果指令是"RIGHT",则x坐标加1。
        else:
            x += 1
    
    # 根据最终位置计算结果,并打印出来。结果是n乘以y坐标加上x坐标。
    print(n * y + x)

C题 小理吃甜食(通过率25.44%)

题目描述:

解题思路:

读取输入数据

  • 读取两个整数 m 和 n

  • 创建一个列表 lts 来存储每一行的甜食糖分。

  • 对于每一行数据,读取并转换为整数列表,然后对该列表进行降序排序。

计算每轮的最大糖分

  • 对于每一轮游戏,找出当前轮次中每个同学可选甜食的最大糖分。

  • 将每轮的最大糖分累加到变量 s 中。

输出结果

  • 输出变量 s,即小理在整个游戏中能吃到的甜食的最大总糖分。

代码实现 :

# 导入sys模块,用于访问命令行输入流。
import sys

# 将sys.stdin转换为迭代器,这样可以逐行读取输入。
data = iter(sys.stdin)

# 读取第一行输入,使用空格分隔,并转换为整数。
# m 表示同学的数量,n 表示游戏的轮数。
m, n = map(int, next(data).split())

# 初始化一个空列表lts来存储所有行的数据。
lts = []

# 初始化一个变量s用于累加每轮的最大糖分。
s = 0

# 对于每一行数据,执行以下操作:
for _ in range(m):
    # 读取当前行的数据,按空格分割,并转换为整数。
    # 使用sorted排序这一行的数字,排序规则是按降序排列。
    # key=lambda x: -x 意味着对整数取负值来实现降序排序。
    row = sorted(map(int, next(data).split()), key=lambda x: -x)
    
    # 将排序后的行添加到列表lts中。
    lts.append(row)

# 对于每一轮游戏(共n轮),执行以下操作:
for i in range(n):
    # 初始化一个变量mx来记录当前轮次的最大糖分。
    mx = 0
    
    # 对于每一行(共m行),执行以下操作:
    for j in range(m):
        # 找出当前轮次第j行的甜食糖分,并与当前最大糖分比较,更新最大糖分。
        mx = max(mx, lts[j][i])
    
    # 将找到的当前轮次的最大糖分添加到总和s中。
    s += mx

# 输出最终的总糖分s。
print(s)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值