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

数据范围

  • 科目名称和学生姓名均只由英文字母构成,长度不超过 个字符。
  • 成绩是 的整数。

题解

自定义排序

在这个问题中,需要实现一个简单的学生成绩管理系统。首先,要读取输入的信息,包括学生人数、科目数量、各个科目的名称以及每个学生的姓名和对应的成绩。根据用户指定的科目进行排序,如果指定的科目不存在,则按总分进行排序。

解决思路:

  1. 数据存储:我们可以使用一个列表来存储每个学生的信息,包括他们的姓名和各个科目的成绩。

  2. 计算总分:在对学生进行排序之前,我们需要计算每个学生的总分,以便在需要时使用。

  3. 排序逻辑:我们可以使用 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%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论
这题大家觉得有困难的可以留言
点赞 回复 分享
发布于 2024-11-08 11:13 江苏

相关推荐

02-11 17:51
腾讯_TEG_技术
点赞 评论 收藏
分享
01-17 08:34
门头沟学院 Java
想找对象的单身狗在努力存钱:这工资不低了,再高点人家要招博士硕士的
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客企业服务