diff --git a/某大厂算法题库/比赛的冠亚季军/冠亚季军比赛.py b/某大厂算法题库/比赛的冠亚季军/冠亚季军比赛.py
new file mode 100644
index 0000000..2ab7d47
--- /dev/null
+++ b/某大厂算法题库/比赛的冠亚季军/冠亚季军比赛.py
@@ -0,0 +1,74 @@
+# 获取输入的运动员的实力值
+tmp = list(map(int, input("请输入运动员的实力值,以空格隔开").split()))
+print(tmp)
+
+class Sport:
+ def __init__(self, idx, strength):
+ self.idx = idx
+ self.strength = strength
+
+# 将输入的运动员实力值转化为运动员集合
+sports = []
+for i in range(len(tmp)):
+ sports.append(Sport(i, tmp[i]))
+
+# 晋级赛
+def promote(sports, ans):
+ # 记录胜者组
+ win = []
+ # 记录败者组
+ fail = []
+
+ for i in range(1, len(sports), 2):
+ # 每组比赛序号大的运动员
+ major = sports[i]
+ # 每组比赛序号小的运动员
+ minor = sports[i-1]
+
+ if major.strength > minor.strength:
+ win.append(major)
+ fail.append(minor)
+ else:
+ win.append(minor)
+ fail.append(major)
+
+ # 如果晋级赛中,运动员个数为奇数,则最后一个运动员直接晋级
+ if len(sports)%2 != 0:
+ win.append(sports[-1])
+
+ # 依次头部压入失败组、胜者组
+ ans.insert(0, fail)
+ ans.insert(0, win)
+
+ # 当保留组超过3个的时候,那么需要将超过部分去掉,因为这部分已经无缘季军
+ while len(ans) > 3:
+ ans.pop()
+
+# 算法入口
+def getresult():
+ # 保留组ans只保留三个组:冠军组、亚军组和季军组
+ ans = []
+
+ # 晋级赛
+ promote(sports, ans)
+
+ # 冠军组如果还不是一个人,那么还需要取出冠军组继续进行晋级赛
+ if len(ans[0]) != 1:
+ promote(ans.pop(0), ans)
+
+ # 冠军
+ first = ans[0][0].idx
+
+ # 亚军
+ second = ans[1][0].idx
+
+ # 季军
+ ans[2].sort(key=lambda x: (-x.strength, x.idx))
+ third = ans[2][0].idx
+
+ return f"{first} {second} {third}"
+
+
+if __name__ == "__main__":
+ res = getresult()
+ print(res)
\ No newline at end of file
diff --git a/某大厂算法题库/比赛的冠亚季军/说明.md b/某大厂算法题库/比赛的冠亚季军/说明.md
new file mode 100644
index 0000000..72e3118
--- /dev/null
+++ b/某大厂算法题库/比赛的冠亚季军/说明.md
@@ -0,0 +1,100 @@
+# 比赛的冠亚季军
+
+## 题目描述
+
+有N(3 ≤ N < 10000)个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下一轮;实力值大的获胜,实力值相等的情况,id小的情况下获胜;轮空的直接进入下一轮。
+
+## 输入描述
+
+输入一行N个数字代表N的运动员的实力值(0<=实力值<=10000000000)。
+
+## 输出描述
+
+输出冠亚季军的id,用空格隔开。
+
+## 用例
+
+| **输入** | 2 3 4 5 |
+| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 输出 | 3 1 2 |
+| 说明 | 第一轮比赛,
id为0实力值为2的运动员和id为1实力值为3的运动员比赛,1号胜出进入下一轮争夺冠亚军,
id为2的运动员和id为3的运动员比赛,3号胜出进入下一轮争夺冠亚军,
冠亚军比赛,3号胜1号,
故冠军为3号,亚军为1号,2号与0号,比赛进行季军的争夺,2号实力值为4,0号实力值2,故2号胜出,得季军。冠亚季军为3 1 2。 |
+
+## 题目解析
+
+本题主要考察逻辑分析
+
+每轮晋级赛,都会将人数砍一半,因此本题不怕大数量级
+
+在每轮晋级赛中,相邻的运动员组队进行比赛,比如有实力数组:[0,1,2,3,4,5,6,7,8]
+
+其中0,1比赛,2,3比赛,4,5比赛,6,7比赛,其中实力较大者晋级去竞争冠亚季军,对于8而言,没有对手,直接晋级
+
+按照上面的逻辑,得到获胜组为:[1,3,5,7,8],失败组为:[0,2,4,6]
+
+我们可以创建一个链表用于保存每轮的获胜组和失败组,但是需要保证获胜组在头部
+
+即可得[1,3,5,7,8]->[0,2,4,6]
+
+接下来去除链表头部组[1,3,5,7,8],继续进行晋级赛
+
+其中1,3比赛,5,7比赛,8没有对手直接晋级
+
+最后得到获胜组[3,7,8],失败组[1,5],将他们压入链表头部
+
+[3,7,8] --> [1,5] --> [0,2,4,6]
+
+接下来,取出链表头部组[3,7,8],继续进行晋级赛:
+
+其中3、7比赛,8没有对手直接晋级
+
+最后得到获胜组[7,8],失败组[3],将他们压入链表头部
+
+[7,8] --> [3] --> [1,5]
+
+而链表头部的运动员个数还不为1,即还有多个人竞争冠军
+
+继续取出链表头部组[7,8],进行晋级赛
+
+其中7、8比赛
+
+最后得到获胜组[8],失败组[7],将他们压入链表头部
+
+[8] --> [7] --> [3] --> [1,5]
+
+此链表长度超过了3,因此链表尾部的组失去了竞争季军的资格,因此弹出尾部,剩余
+
+[8] --> [7] --> [3]
+
+最后的冠军实力值8,亚军实力值7,季军实力值3
+
+题目最后要求输出的是运动员id,因此我们在一开始的时候可以定义一个运动员类,属性有运动员的id和实力值。
+
+这样最后输出就可以获取到运动员的id了。
+
+还有一点需要注意的是:
+
+最后一轮晋级赛,必然只有两个人,即分出冠军和亚军
+
+倒数第二轮晋级赛,只可能是4人,或者3人,如下图:
+
+
+
+
+
+如果倒数第二轮晋级赛有五人的话,是无法在下轮中产生冠军和亚军的
+
+
+
+因此,季军争夺组只会有2人或者1人,因为,如下图,倒数第二轮晋级赛的失败者只有两人或者一人
+
+
+
+
+
+因此,前面定义的链表,最终的形态如下:
+
+第一个节点只有一个运动员(冠军),第二个节点只有一个运动员(亚军),第三个节点可能有一个,也可能有两个(季军争夺)。
+
+因此,针对第三个节点,需要进行季军争夺,直接进行排序取第一个人即可,排序逻辑:
+
+- 实力值大的获胜,如果实力值相同,则id值小的获胜。