比赛相关题目描述及相关代码
This commit is contained in:
42
某大厂算法题库/比赛/比赛.py
Normal file
42
某大厂算法题库/比赛/比赛.py
Normal file
@@ -0,0 +1,42 @@
|
||||
from functools import cmp_to_key
|
||||
|
||||
# 输入评委人数和参赛选手人数
|
||||
m, n = map(int, input("请输入评委人数和参赛人数(以英文逗号隔开,如4,5): ").split(','))
|
||||
scores = [list(map(int, input("请输入评委打分(以英文逗号隔开): ").split(','))) for _ in range(m)]
|
||||
|
||||
|
||||
def cmp(a, b):
|
||||
if a["sum"] != b["sum"]:
|
||||
return b["sum"] - a["sum"]
|
||||
|
||||
for i in range(m):
|
||||
if a["score"][i] == b["score"][i]:
|
||||
continue
|
||||
return b["score"][i] - a["score"][i]
|
||||
return 0
|
||||
|
||||
|
||||
def getresult():
|
||||
if m < 3 or m > 10 or n < 3 or n > 100:
|
||||
return "-1"
|
||||
|
||||
players = []
|
||||
|
||||
for j in range(n):
|
||||
player = []
|
||||
for i in range(m):
|
||||
if scores[i][j] < 1 or scores[i][j] > 10:
|
||||
return "-1"
|
||||
player.append(scores[i][j])
|
||||
player.sort(reverse=True)
|
||||
players.append({
|
||||
"idx": j,
|
||||
"sum": sum(player),
|
||||
"score": player
|
||||
})
|
||||
sorted_players = sorted(players, key=cmp_to_key(cmp))
|
||||
|
||||
return ",".join(list(map(lambda x: str(x["idx"] + 1), sorted_players[:3])))
|
||||
|
||||
|
||||
print(getresult())
|
||||
103
某大厂算法题库/比赛/相关延伸.py
Normal file
103
某大厂算法题库/比赛/相关延伸.py
Normal file
@@ -0,0 +1,103 @@
|
||||
# map的使用方法
|
||||
"""
|
||||
map()函数的核心作用是:将一个函数应用到一个或多个可迭代对象的每个元素上,返回一个迭代器,可理解为批量处理元素的工具
|
||||
基本语法:
|
||||
map(function, iterable, ...)
|
||||
function: 要执行的函数(可以是普通函数、匿名函数lambda、内置函数)
|
||||
iterable: 一个或多个可迭代对象(列表、元组、字符串、集合等)
|
||||
返回值: map对象(迭代器),需通过list()/tuple()等转为具体序列才能直观查看结果
|
||||
"""
|
||||
# 示例
|
||||
# 批量转化
|
||||
nums1 = ['11', '14', '13', '22']
|
||||
result1 = map(int, nums1)
|
||||
print(list(result1))
|
||||
|
||||
# 批量计算
|
||||
nums2 = [2, 3, 4, 5, 6]
|
||||
result2 = map(lambda x: x ** 2, nums2)
|
||||
print(list(result2))
|
||||
|
||||
# 多个可迭代对象
|
||||
lst1 = [1, 2, 3]
|
||||
lst2 = [10, 20, 30]
|
||||
result3 = map(lambda x, y: x + y, lst1, lst2)
|
||||
print(list(result3))
|
||||
|
||||
# 可迭代对象不一致时,以最短的可迭代对象为准,超出部分直接忽略
|
||||
lst3 = [1, 2, 3]
|
||||
lst4 = [10, 20, 30, 40, 50]
|
||||
result4 = map(lambda x, y: x + y, lst3, lst4)
|
||||
print(list(result4))
|
||||
|
||||
# cmp_to_key的使用方法
|
||||
"""
|
||||
functools.cmp_to_key()是处理自定义排序规则的关键工具,核心作用是将传统的比较函数转换为排序所需的key函数,让我们能自定义更灵活的排序逻辑。
|
||||
基本语法:
|
||||
from functools import cmp_to_key
|
||||
|
||||
def compare(a, b):
|
||||
# 返回规则
|
||||
# -1: a排在b前面
|
||||
# 1: a排在b后面
|
||||
# 0: a和b位置不变
|
||||
if 条件1:
|
||||
return -1
|
||||
elif 条件2:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
sorted_result = sorted(iterable, key=cmp_to_key(compare))
|
||||
"""
|
||||
|
||||
# 示例1
|
||||
# 对数字列表按绝对值从大到小排序
|
||||
from functools import cmp_to_key
|
||||
|
||||
|
||||
def compare(a, b):
|
||||
abs_a = abs(a)
|
||||
abs_b = abs(b)
|
||||
if abs_a > abs_b:
|
||||
return -1 # a的绝对值大,a排前面
|
||||
elif abs_a < abs_b:
|
||||
return 1 # a的绝对值小,a排后面
|
||||
else:
|
||||
return 0 # 绝对值相等,位置不变
|
||||
|
||||
|
||||
nums = [3, -5, 1, -2, 4]
|
||||
sorted_nums = sorted(nums, key=cmp_to_key(compare))
|
||||
print(sorted_nums)
|
||||
|
||||
# 示例2
|
||||
# 多条件自定义排序,对学生列表先按分数降序,分数相同再按年龄升序
|
||||
students = [
|
||||
{"name": "张三", "score": 90, "age": 18},
|
||||
{"name": "李四", "score": 85, "age": 19},
|
||||
{"name": "王五", "score": 90, "age": 17},
|
||||
{"name": "赵六", "score": 88, "age": 20}
|
||||
]
|
||||
|
||||
from functools import cmp_to_key
|
||||
|
||||
|
||||
def cmp(a, b):
|
||||
# 先比较分数,降序
|
||||
if a["score"] > b["score"]:
|
||||
return -1
|
||||
elif a["score"] < b["score"]:
|
||||
return 1
|
||||
else:
|
||||
# 分数相同,在比较年龄,升序
|
||||
if a["age"] < b["age"]:
|
||||
return -1
|
||||
elif a["age"] > b["age"]:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
|
||||
sorted_students = sorted(students, key=cmp_to_key(cmp))
|
||||
print(sorted_students)
|
||||
91
某大厂算法题库/比赛/说明.md
Normal file
91
某大厂算法题库/比赛/说明.md
Normal file
@@ -0,0 +1,91 @@
|
||||
# 比赛
|
||||
|
||||
## 题目描述
|
||||
|
||||
- 一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。
|
||||
- 打分规则为每个评委对选手打分,最高分10分,最低分1分。
|
||||
- 请计算得分最多的3位选手的编号。
|
||||
- 如果得分相同,则得分高分值最多的选手排名靠前
|
||||
- (10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况)。
|
||||
|
||||
## 输入描述
|
||||
|
||||
- 第一行为半角逗号分割的两个正整数,第一个数字表示M(3<=M<=10)个评委,第二个数字表示N(3<=N<=100)个选手。
|
||||
- 第2到M+1行是半角逗号分割的整数序列,表示评委为每个选手的打分,0号下标数字表示1号选手分数,1号下标数字表示2号选手分数,依次类推。
|
||||
|
||||
## 输出描述
|
||||
|
||||
- 选手前3名的编号。
|
||||
- 注:若输入为异常,输出-1,如M、N、打分不在范围内。
|
||||
|
||||
## 用例
|
||||
|
||||
| 输入 | 4,5<br/>10,6,9,7,6<br/>9,10,6,7,5<br/>8,10,6,5,10<br/>9,10,8,4,9 |
|
||||
| --- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 输出 | 2,1,5 |
|
||||
| 说明 | 第一行代表有4个评委,5个选手参加比赛;<br/>矩阵代表是4*5,每个数字是选手的编号,每一行代表一个评委对选手的打分排序;<br/>2号选手得分36分排第1,1号选手36分排第2,5号选手30分(2号10分值有3个,1号10分值只有1个,所以2号排第一); |
|
||||
|
||||
| 输入 | 2,5<br/>7,3,5,4,2<br/>8,5,4,4,3 |
|
||||
| --- | ------------------------------- |
|
||||
| 输出 | -1 |
|
||||
| 说明 | 只有2个评委,要求最少为3个评委 |
|
||||
|
||||
| 输入 | 4,2<br/>8,5<br/>5,6<br/>10,4<br/>8,9 |
|
||||
| --- | ------------------------------------ |
|
||||
| 输出 | -1 |
|
||||
| 说明 | 只有2名选手参加,要求最少为3名 |
|
||||
|
||||
| 输入 | 4,5<br/>11,6,9,7,8<br/>9,10,6,7,8<br/>8,10,6,9,7<br/>9,10,8,6,7 |
|
||||
| --- | --------------------------------------------------------------- |
|
||||
| 输出 | -1 |
|
||||
| 说明 | 第一个评委给第一个选手打分11,无效分数 |
|
||||
|
||||
## 题目解析
|
||||
|
||||
考察数组排序,主要难点在于下面逻辑的设计:
|
||||
|
||||
如果得分相同,则得分高分值最多的选手排名靠前
|
||||
|
||||
## 相关延伸
|
||||
|
||||
对新手来说,map、function.cmp_to_key的使用方法
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user