获得徽章 9
- #刷题交流# 小F面临一个有趣的挑战:给定一个数组,她需要将数组中的数字分为两组。分组的目标是使得一组数字的和的个位数等于给定的 A,另一组数字的和的个位数等于给定的 B。除此之外,还有一种特殊情况允许其中一组为空,但剩余数字和的个位数必须等于 A 或 B。小F需要计算所有可能的划分方式。
这需要解决一个分组和计算的问题,使用动态规划(Dynamic Programming, DP)方法较为合适。
思路:模运算转换:因为我们关心的是数字和的个位数,可以将所有数字进行 mod 10 操作,简化问题。
状态定义:使用一个 DP 数组 dp[x][y],表示是否可以将某些数字分成两组,使得一组的和的个位数为𝑥
x,另一组的和的个位数为 y。
状态转移:遍历数组中的每个数字,更新 DP 状态。每个数字可以被分配到组 A 或组 B,或者不分组。
特殊情况:如果所有数字的和的个位数等于 𝐴 或 𝐵,则允许一组为空。
结果统计:最后检查所有有效的 DP 状态,统计满足条件的划分方式。展开赞过评论1 - #刷题交流# 抢红包的游戏:def solution(n: int, s: list, x: list) -> list:
# 将名字和金额打包成元组列表,记录原始顺序
participants = [(s[i], x[i], i) for i in range(n)]
# 按金额降序排序,如果金额相同则按输入顺序排序(通过索引)
participants.sort(key=lambda item: (-item[1], item[2]))
# 提取排序后的名字
return [participant[0] for participant in participants]
if __name__ == '__main__':
print(solution(4, ["a", "b", "c", "d"], [1, 2, 2, 1]) == ['b', 'c', 'a', 'd'])
print(solution(3, ["x", "y", "z"], [100, 200, 200]) == ['y', 'z', 'x'])
print(solution(5, ["m", "n", "o", "p", "q"], [50, 50, 30, 30, 20]) == ['m', 'n', 'o', 'p', 'q'])展开评论点赞 - #刷题交流# 第一次发刷题沸点,这样可以吗?
小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。
刷题展示:import math
def solution(x: int, y: int) -> int:
# 计算到靶心的距离
distance = math.sqrt(x**2 + y**2)
# 根据距离判断得分
for i in range(1, 11):
if distance <= i:
return 11 - i
return 0 # 超出所有环,得0分
# 测试用例
if __name__ == '__main__':
print(solution(1, 0) == 10) # 位于半径为1的圆内
print(solution(1, 1) == 9) # 位于半径为2的圆内
print(solution(0, 5) == 6) # 位于半径为5的圆内
print(solution(3, 4) == 6) # 位于半径为5的圆内展开评论点赞