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 江苏

相关推荐

最终还是婉拒了小红书的offer,厚着脸皮回了字节。其实这次字节不管是组内的氛围、HR的沟通体验,都比之前好太多,开的薪资也还算过得去,这些都是让我下定决心的原因之一。但最核心的,还是抵不住对Agent的兴趣,选择了Ai&nbsp;Coding这么一个方向。因为很多大佬讲过,在未来比较火的还是属于那些更加垂类的Agent,而Ai&nbsp;Coding恰好是Coding&nbsp;Agent这么一个领域,本质上还是程序员群体和泛程序员群体这个圈子的。目前也已经在提前实习,也是全栈这么一个岗位。就像最近阿里P10针对前端后端等等不再那么区分,确实在Agent方向不太区分这个。尤其是我们自己做AI&nbsp;Coding的内容,基本上90%左右的内容都是AI生成的,AI代码仓库贡献率也是我们的指标之一。有人说他不好用,那肯定是用的姿态不太对。基本上用对Skill、Rules&nbsp;加上比较好的大模型基本都能Cover你的大部分需求,更别说Claude、Cursor这种目前看来Top水准的Coding工具了(叠甲:起码在我看来是这样)。所以不太区分的主要原因,还是针对一些例如Claude&nbsp;Code、Cursor、Trae、Codex、CC等一大堆,他们有很多新的概念和架构提出,我们往往需要快速验证(MVP版本)来看效果。而全栈就是这么快速验证的一个手段,加上Ai&nbsp;Coding的辅助,目前看起来问题不大(仅仅针对Agent而言)。而且Coding的产品形态往往是一个Plugin、Cli之类的,本质还是属于大前端领域。不过针对业务后端来看,区分还是有必要的。大家很多人也说Agent不就是Prompt提示词工程么?是的没错,本质上还是提示词。不过现在也衍生出一个新的Context&nbsp;Eneering,抽象成一种架构思想(类比框架、或者你们业务架构,参考商品有商品发布架构来提效)。本质还是提示词,但是就是能否最大化利用整个上下文窗口来提升效果,这个还是有很多探索空间和玩法的,例如Cursor的思想:上下文万物皆文件,&nbsp;CoWork之类的。后续也有一些Ralph&nbsp;Loop啥的,还有Coding里面的Coding&nbsp;Act姿态。这种才是比较核心的点,而不是你让AI生成的那提示词,然后调用了一下大模型那么简单;也不是dify、LangGraph搭建了一套workflow,从一个node走到另外一个node那么简单。Agent和WorkFLow还是两回事,大部分人也没能很好的区分这一点。不过很多人说AI泡沫啥啥啥的,我们ld也常把这句话挂在嘴边:“说AI泡沫还是太大了”诸如此类。我觉得在AI的时代,懂一点还是会好一点,所以润去字节了。目前的实习生活呢,除了修一些Tools的问题,还包括对比Claude、Cursor、Trae在某些源码实现思想上的点,看看能不能迁移过来,感觉还是比较有意思。不过目前组内还是主要Follow比较多,希望下一个阶段就做一些更有创新的事情哈哈。这就是一个牛马大学生的最终牧场,希望能好好的吧。说不定下次发的时候,正式AI泡沫结束,然后我又回归传统后端这么一个结局了。欢迎交流👏,有不对的🙅不要骂博主(浅薄的认知),可以私聊交流
码农索隆:和优秀的人,做有挑战的事
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务