【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 智能成绩表(100分) - 三语言AC题解(Python/Java/Cpp)

本文主要是介绍【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 智能成绩表(100分) - 三语言AC题解(Python/Java/Cpp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

智能成绩表(100分)

🌍 评测功能需要 订阅专栏 后私信联系清隆解锁~

🍓OJ题目截图

在这里插入图片描述

文章目录

    • 📎在线评测链接
    • 🍓OJ题目截图
    • 🌲 智能成绩表
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码

🌲 智能成绩表

问题描述

K小姐是一位教师,她需要一个学生成绩管理系统来帮助她对学生的考试成绩进行排名。系统需要支持按照总分或者单科成绩进行排序。你能帮帮她吗?

输入格式

第一行包含两个正整数 n n n m m m,分别表示学生人数和科目数量。( 0 < n < 100 , 0 < m < 10 0 < n < 100, 0 < m < 10 0<n<100,0<m<10)

第二行包含 m m m 个由空格隔开的科目名称。科目名称只由英文字母构成,单个长度不超过 10 10 10 个字符。科目的出现顺序和后续输入的学生成绩一一对应,不会出现重复的科目名称。

接下来的 n n n 行,每行包含一个学生的姓名和该生 m m m 个科目的成绩(空格隔开)。学生姓名只由英文字母构成,长度不超过 10 10 10 个字符。成绩是 0 0 0 100 100 100 的整数,依次对应第二行输入的科目。

最后一行输入一个字符串,表示用作排名的科目名称。若该科目不存在,则按总分进行排序。

输出格式

输出一行,表示按成绩排序后的学生姓名,用空格隔开。如果有成绩相同的情况,则按照学生姓名的字典序进行排序。

样例输入

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

数据范围

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

题解

本题需要我们实现一个学生成绩管理系统,根据输入的学生信息和排序科目,输出按要求排序后的学生姓名。

首先,我们可以定义一个 Student 类来表示学生,包含学生姓名和一个排名要素列表。排名要素列表中,前 m m m 个元素对应 m m m 个科目的成绩,最后一个元素表示总分。

然后,我们读取输入并初始化学生列表。在读取科目信息时,我们可以用一个字典 subject_rankIdx 来存储科目名称到其在排名要素列表中的序号的映射关系。

接着,我们读取排序科目。如果该科目存在,我们取出其对应的序号 rankIdx,否则使用总分所在的序号 m

最后,我们使用 sort 函数对学生列表进行排序。排序的 key 函数为一个 lambda 表达式,先比较 rank[rankIdx] 的值(降序),再比较学生姓名的字典序。

排序后,我们将学生姓名用空格连接并输出即可。

该方法的时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn),主要是排序的复杂度。空间复杂度为 O ( n ) O(n) O(n),需要存储所有学生的信息。

参考代码

  • Python
class Student:def __init__(self, name, rank):self.name = nameself.rank = rankn, m = map(int, input().split())
subject_rankIdx = {}
subjects = input().split()for i in range(m):subject_rankIdx[subjects[i]] = istudents = []
for _ in range(n):data = input().split()name, scores = data[0], list(map(int, data[1:]))rank = scores + [sum(scores)]students.append(Student(name, rank))subject = input()
rankIdx = subject_rankIdx.get(subject, m)students.sort(key=lambda x: (-x.rank[rankIdx], x.name))
print(" ".join(stu.name for stu in students))
  • Java
import java.util.*;class Student {String name;int[] rank;Student(String name, int[] rank) {this.name = name;this.rank = rank;}
}public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(), m = sc.nextInt();sc.nextLine(); // 消耗换行符Map<String, Integer> subjectRankIdx = new HashMap<>();String[] subjects = sc.nextLine().split(" ");for (int i = 0; i < m; i++) {subjectRankIdx.put(subjects[i], i);}List<Student> students = new ArrayList<>();for (int i = 0; i < n; i++) {String[] data = sc.nextLine().split(" ");String name = data[0];int[] scores = new int[m];for (int j = 0; j < m; j++) {scores[j] = Integer.parseInt(data[j + 1]);}int total = Arrays.stream(scores).sum();int[] rank = Arrays.copyOf(scores, m + 1);rank[m] = total;students.add(new Student(name, rank));}String subject = sc.nextLine();int rankIdx = subjectRankIdx.getOrDefault(subject, m);students.sort((a, b) -> {if (b.rank[rankIdx] != a.rank[rankIdx]) {return b.rank[rankIdx] - a.rank[rankIdx];} else {return a.name.compareTo(b.name);}});List<String> names = students.stream().map(stu -> stu.name).toList();System.out.println(String.join(" ", names));}
}
  • Cpp
#include <iostream>
#include <sstream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;struct Student {string name;vector<int> rank;Student(string name, vector<int> rank) : name(name), rank(rank) {}
};int main() {int n, m;cin >> n >> m;cin.ignore();unordered_map<string, int> subjectRankIdx;string subjects;getline(cin, subjects);stringstream ss(subjects);string subject;for (int i = 0; i < m; i++) {ss >> subject;subjectRankIdx[subject] = i;

这篇关于【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 智能成绩表(100分) - 三语言AC题解(Python/Java/Cpp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073113

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2