E-智能成绩表(100p)
OD刷题笔记合集🔗
智能成绩表
问题描述
K小姐是一位教师,她需要一个学生成绩管理系统来帮助她对学生的考试成绩进行排名。系统需要支持按照总分或者单科成绩进行排序。你能帮帮她吗?
输入格式
第一行包含两个正整数 和
,分别表示学生人数和科目数量。(
)
第二行包含 个由空格隔开的科目名称。科目名称只由英文字母构成,单个长度不超过
个字符。科目的出现顺序和后续输入的学生成绩一一对应,不会出现重复的科目名称。
接下来的 行,每行包含一个学生的姓名和该生
个科目的成绩(空格隔开)。学生姓名只由英文字母构成,长度不超过
个字符。成绩是
到
的整数,依次对应第二行输入的科目。
最后一行输入一个字符串,表示用作排名的科目名称。若该科目不存在,则按总分进行排序。
输出格式
输出一行,表示按成绩排序后的学生姓名,用空格隔开。如果有成绩相同的情况,则按照学生姓名的字典序进行排序。
样例输入
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 98
minmin 100 82
shuxue
样例输出
xiaohua fangfang minmin
样例输入
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen
样例输出
fangfang minmin xiaohua
数据范围
- 科目名称和学生姓名均只由英文字母构成,长度不超过
个字符。
- 成绩是
到
的整数。
题解
自定义排序
在这个问题中,需要实现一个简单的学生成绩管理系统。首先,要读取输入的信息,包括学生人数、科目数量、各个科目的名称以及每个学生的姓名和对应的成绩。根据用户指定的科目进行排序,如果指定的科目不存在,则按总分进行排序。
解决思路:
-
数据存储:我们可以使用一个列表来存储每个学生的信息,包括他们的姓名和各个科目的成绩。
-
计算总分:在对学生进行排序之前,我们需要计算每个学生的总分,以便在需要时使用。
-
排序逻辑:我们可以使用 Python 的内置排序功能,根据指定的科目或总分对学生进行排序。如果有多个学生的成绩相同,则按姓名字典序进行排序。
参考代码
# 引入所需模块
from typing import List, Tuple
def rank_students(n: int, m: int, subjects: List[str], scores: List[Tuple[str, List[int]]], rank_subject: str) -> List[str]:
# 创建一个字典以存储每个科目的索引
subject_index = {subject: index for index, subject in enumerate(subjects)}
# 如果指定的排名科目不存在,则使用总分进行排名
if rank_subject not in subject_index:
# 按照总分计算并排序
sorted_students = sorted(scores, key=lambda x: (-sum(x[1]), x[0]))
else:
# 获取指定科目的索引
subject_idx = subject_index[rank_subject]
# 按照指定科目的成绩进行排序
sorted_students = sorted(scores, key=lambda x: (-x[1][subject_idx], x[0]))
# 提取排序后的学生姓名并返回
return [student[0] for student in sorted_students]
# 示例输入处理与输出展示
if __name__ == "__main__":
n, m = map(int, input().split())
subjects = input().split()
scores = []
for _ in range(n):
data = input().split()
name = data[0]
grades = list(map(int, data[1:m+1]))
scores.append((name, grades))
rank_subject = input().strip()
# 调用函数并打印结果
result = rank_students(n, m, subjects, scores, rank_subject)
print(" ".join(result))
- Python
# 引入所需模块
from typing import List, Tuple
def rank_students(n: int, m: int, subjects: List[str], scores: List[Tuple[str, List[int]]], rank_subject: str) -> List[str]:
# 创建一个字典以存储每个科目的索引
subject_index = {subject: index for index, subject in enumerate(subjects)}
# 如果指定的排名科目不存在,则使用总分进行排名
if rank_subject not in subject_index:
# 按照总分计算并排序
sorted_students = sorted(scores, key=lambda x: (-sum(x[1]), x[0]))
else:
# 获取指定科目的索引
subject_idx = subject_index[rank_subject]
# 按照指定科目的成绩进行排序
sorted_students = sorted(scores, key=lambda x: (-x[1][subject_idx], x[0]))
# 提取排序后的学生姓名并返回
return [student[0] for student in sorted_students]
# 示例输入处理与输出展示
if __name__ == "__main__":
n, m = map(int, input().split())
subjects = input().split()
scores = []
for _ in range(n):
data = input().split()
name = data[0]
grades = list(map(int, data[1:m+1]))
scores.append((name, grades))
rank_subject = input().strip()
# 调用函数并打印结果
result = rank_students(n, m, subjects, scores, rank_subject)
print(" ".join(result))
- C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
#define MAX_M 10
#define MAX_NAME_LEN 11
// 学生结构体
typedef struct {
char name[MAX_NAME_LEN];
int *scores; // 动态分配的分数数组
} Student;
// 全局变量,用于排序比较
int rank_index;
int subject_count;
// 比较函数,用于qsort
int compare(const void *a, const void *b) {
const Student *studentA = *(const Student **)a;
const Student *studentB = *(const Student **)b;
if (studentA->scores[rank_index] != studentB->scores[rank_index]) {
return studentB->scores[rank_index] - studentA->scores[rank_index];
}
return strcmp(studentA->name, studentB->name);
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
subject_count = m;
char subjects[MAX_M][MAX_NAME_LEN];
for (int i = 0; i < m; i++) {
scanf("%s", subjects[i]);
}
Student **students = malloc(n * sizeof(Student *));
for (int i = 0; i < n; i++) {
students[i] = malloc(sizeof(Student));
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记