P1093 [NOIP 2007 普及组] 奖学金 python
时间: 2025-06-28 16:10:33 浏览: 19
### NOIP 2007 普及组 P1093 奖学金 Python 解题思路
#### 数据结构的选择
为了高效处理数据并满足题目要求,可以利用列表来存储学生的成绩和其他相关信息。通过定义一个类 `Student` 来封装每位学生的信息,包括姓名、班级编号以及三门科目的分数。
```python
class Student:
def __init__(self, name, class_id, scores):
self.name = name
self.class_id = class_id
self.scores = scores
@property
def total_score(self):
return sum(self.scores)
```
此方法有助于后续对学生对象的操作和比较[^1]。
#### 排序策略
根据题目需求,需要按照总分降序排列所有学生记录。如果遇到相同总分的情况,则按语文成绩高低再次排序;若仍然存在平局情况,则依据英语成绩决定先后顺序。最后,在这些条件下仍无法区分的情况下,保持输入时原有的相对位置不变即可。
为此,可以在创建好所有的 `Student` 对象之后调用内置函数 `sorted()` 并传入自定义的关键字参数 key 和 reverse 参数完成最终的排序操作:
```python
students_sorted_by_total_and_subjects = sorted(
students,
key=lambda s: (-s.total_score, -s.scores[0], -s.scores[2]),
reverse=True
)
```
上述代码片段实现了基于多条件组合下的稳定排序机制。
#### 输出结果
经过以上步骤得到的结果可以直接遍历输出前五名获奖者的名字及其对应的奖项名称。注意这里假设已经有一个名为 `awards` 的列表用于保存各个等级奖品的具体描述信息。
```python
for i in range(5):
award_name = awards[i % len(awards)]
print(f"{award_name}: {students_sorted_by_total_and_subjects[i].name}")
```
这段简单的循环语句能够依次打印出每一名优胜者的荣誉证书内容。
### 完整代码实现
以下是完整的 Python 实现方案,涵盖了从读取输入到计算排名再到输出奖励名单的过程:
```python
from typing import List
class Student:
def __init__(self, name: str, class_id: int, scores: List[int]):
self.name = name
self.class_id = class_id
self.scores = scores
@property
def total_score(self) -> int:
return sum(self.scores)
def main():
n = int(input())
# 初始化学生数组
students = []
for _ in range(n):
data = input().split()
student_info = [
data[0],
int(data[1]),
list(map(int, data[2:])),
]
students.append(Student(*student_info))
# 排序规则:先按总分降序再分别考虑单科成绩
students_sorted = sorted(students, key=lambda s: (-s.total_score, -s.scores[0], -s.scores[2]))
# 预设五个不同类型的奖项
awards = ["一等奖", "二等奖", "三等奖"]
# 打印前五位得奖人的名字连同所获头衔
for idx in range(min(len(students), 5)):
print(f'{awards[idx%len(awards)]} : {students_sorted[idx].name}')
if __name__ == "__main__":
main()
```
阅读全文
相关推荐


















