华为OD机试 - 智能成绩表( Python C C++ JavaGo JS PHP)
题目描述
小明是一名新老师,他需要将学生按考试总分或单科分数进行排名。学生的信息包括姓名、科目和对应的分数。帮助小明完成这个任务吧!
输入描述
-
第一行包含两个整数 n 和 m,分别代表学生人数和科目数量。
- 0 < n < 100
- 0 < m < 10
-
第二行包含 m 个科目名称,用空格隔开。
- 科目名称只包含英文字母,长度不超过10个字符。
- 科目的出现顺序和后续输入的学生成绩一一对应。
- 不会出现重复的科目名称。
-
接下来的 n 行,每行包含一个学生的姓名和该生 m 个科目的成绩(用空格隔开)。
- 学生不会重名。
- 学生姓名只包含英文字母,长度不超过10个字符。
- 成绩是0~100的整数,依次对应第二行输入的科目。
-
第 n+2 行输入用作排名的科目名称。如果科目不存在,则按总分进行排序。
输出描述
输出一行,按成绩排序后的学生名字,用空格隔开。如果成绩相同,则按学生姓名的字典顺序排序。
示例

题目解析
本题的核心在于动态排序规则的应用。排序规则可能基于特定科目的成绩,也可能基于总分。排序过程需要考虑两个因素:
-
排序规则:根据最后一行输入的科目名称确定。如果科目存在,则按该科目成绩排序;如果不存在,则按总分排序。
-
排序细节:在成绩相同的情况下,需要按学生姓名的字典顺序进行排序。
C++代码实现
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>using namespace std;// 学生信息结构体
struct Student {string name;vector<int> scores;int totalScore;
};// 自定义比较函数,用于排序
bool compareStudents(const Student& a, const Student& b, int sortIndex) {// 如果排序索引指向总分,则比较总分if (sortIndex == -1) {return (a.totalScore < b.totalScore) || (a.totalScore == b.totalScore && a.name < b.name);}// 否则,比较指定科目的成绩return (a.scores[sortIndex] < b.scores[sortIndex]) || (a.scores[sortIndex] == b.scores[sortIndex] && a.name < b.name);
}int main() {int n, m;cin >> n >> m;vector<string> subjects(m);for (int i = 0; i < m; ++i) {cin >> subjects[i];}vector<Student> students(n);for (int i = 0; i < n; ++i) {cin >> students[i].name;students[i].scores.resize(m);students[i].totalScore = 0;for (int j = 0; j < m; ++j) {cin >> students[i].scores[j];students[i].totalScore += students[i].scores[j];}}string sortSubject;cin >> sortSubject;// 确定排序索引,如果科目不存在,则索引为-1,表示按总分排序int sortIndex = -1;for (int i = 0; i < m; ++i) {if (subjects[i] == sortSubject) {sortIndex = i;break;}}// 根据排序索引进行排序sort(students.begin(), students.end(), [&](const Student& a, const Student& b) {return compareStudents(a, b, sortIndex);});// 输出排序后的学生名字for (const auto& student : students) {cout << student.name << " ";}cout << endl;return 0;
}
Java代码实现
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import java.util.Vector;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n, m;n = scanner.nextInt();m = scanner.nextInt();Vector<String> subjects = new Vector<>();for (int i = 0; i < m; ++i) {subjects.add(scanner.next());}Student[] students = new Student[n];for (int i = 0; i < n; ++i) {students[i] = new Student();students[i].name = scanner.next();students[i].scores = new int[m];students[i].totalScore = 0;for (int j = 0; j < m; ++j) {students[i].scores[j] = scanner.nextInt();students[i].totalScore += students[i].scores[j];}}String sortSubject = scanner.next();int sortIndex = -1;for (int i = 0; i < m; ++i) {if (subjects.get(i).equals(sortSubject)) {sortIndex = i;break;}}Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student a, Student b) {return compareStudents(a, b, sortIndex);}});for (Student student : students) {System.out.print(student.name + " ");}System.out.println();}public static boolean compareStudents(Student a, Student b, int sortIndex) {// 如果排序索引指向总分,则比较总分if (sortIndex == -1) {return (a.totalScore < b.totalScore) || (a.totalScore == b.totalScore && a.name.compareTo(b.name) < 0);}// 否则,比较指定科目的成绩return (a.scores[sortIndex] < b.scores[sortIndex]) || (a.scores[sortIndex] == b.scores[sortIndex] && a.name.compareTo(b.name) < 0);}
}
Python代码实现
import sys
from collections import Counter
from typing import Listclass Main:def main(self):n, m = map(int, input().split())subjects = list(map(str, input().split()))students = []for i in range(n):students.append({"name": input(), "scores": list(map(int, input().split())), "totalScore": sum(students[-1]["scores"])})sort_subject = input()sort_index = -1for i, subject in enumerate(subjects):if subject == sort_subject:sort_index = ibreakstudents.sort(key=lambda x: (-x["totalScore"], x["name"]) if sort_index == -1 else (-x["scores"][sort_index], x["name"]))for student in students:print(student["name"], end=" ")print()if __name__ == "__main__":Main().main()
C代码实现
#include <stdio.h>
#include <stdbool.h>
#include <string.h>typedef struct {char name[20];int scores[100];int totalScore;
} Student;int compare(const void *a, const void *b) {Student *students = (Student *)a;Student *other = (Student *)b;int sort_index = -1;for (int i = 0; i < students[0].scores[0]; i++) {if (strcmp(students[0].scores[i + 1], sort_subject) == 0) {sort_index = i + 1;break;}}if (sort_index == -1) {return (-students[0].totalScore == -other[0].totalScore) ? strcmp(students[0].name, other[0].name) : -1;} else {return (-students[0].scores[sort_index] == -other[0].scores[sort_index]) ? strcmp(students[0].name, other[0].name) : -1;}
}int main() {int n, m;scanf("%d %d", &n, &m);char sort_subject[20];scanf("%s", sort_subject);Student students[n];for (int i = 0; i < n; i++) {scanf("%s", students[i].name);for (int j = 0; j < m; j++) {scanf("%d", &students[i].scores[j]);}students[i].totalScore = 0;for (int j = 0; j < m; j++) {students[i].totalScore += students[i].scores[j];}}qsort(students, n, sizeof(students[0]), compare);for (int i = 0; i < n; i++) {printf("%s", students[i].name);if (i < n - 1) {printf(" ");}}printf("\n");return 0;
}
Go代码实现
package mainimport ("fmt""io""strings""sort"
)// 学生信息结构体
type Student struct {name stringscores []inttotalScore int
}// 自定义比较函数,用于排序
func compareStudents(a, b Student, sortIndex int) bool {// 如果排序索引指向总分,则比较总分if sortIndex == -1 {return (a.totalScore < b.totalScore) || (a.totalScore == b.totalScore && a.name < b.name)}// 否则,比较指定科目的成绩return (a.scores[sortIndex] < b.scores[sortIndex]) || (a.scores[sortIndex] == b.scores[sortIndex] && a.name < b.name)
}func main() {var reader io.Readerreader = os.Stdinvar n, m intfmt.Fscanf(reader, "%d %d", &n, &m)var subjects []stringfor i := 0; i < m; i++ {var subject stringfmt.Fscanf(reader, "%s", &subject)subjects = append(subjects, subject)}students := make([]Student, n)for i := 0; i < n; i++ {var name stringfmt.Fscanf(reader, "%s", &name)students[i].name = namestudents[i].scores = make([]int, m)students[i].totalScore = 0for j := 0; j < m; j++ {fmt.Fscanf(reader, "%d", &students[i].scores[j])students[i].totalScore += students[i].scores[j]}}var sortSubject stringfmt.Fscanf(reader, "%s", &sortSubject)// 确定排序索引,如果科目不存在,则索引为-1,表示按总分排序sortIndex := -1for i, subject := range subjects {if subject == sortSubject {sortIndex = ibreak}}// 根据排序索引进行排序sort.Slice(students, func(i, j int) bool {return compareStudents(students[i], students[j], sortIndex)})// 输出排序后的学生名字for _, student := range students {fmt.Println(student.name)}
}
PHP代码实现
<?php
$n = 0;
$m = 0;
$subjects = [];
$students = [];
$sortSubject = '';// 学生信息结构体
class Student {public $name;public $scores;public $totalScore;public function __construct($name, $scores, $totalScore) {$this->name = $name;$this->scores = $scores;$this->totalScore = $totalScore;}
}// 自定义比较函数,用于排序
function compareStudents($a, $b, $sortIndex) {// 如果排序索引指向总分,则比较总分if ($sortIndex == -1) {return $a->totalScore < $b->totalScore || ($a->totalScore == $b->totalScore && $a->name < $b->name);}// 否则,比较指定科目的成绩return $a->scores[$sortIndex] < $b->scores[$sortIndex] || ($a->scores[$sortIndex] == $b->scores[$sortIndex] && $a->name < $b->name);
}function main() {$stdin = STDIN;fscanf($stdin, "%d %d", $n, $m);for ($i = 0; $i < $m; ++$i) {fscanf($stdin, "%s", $subjects[$i]);}for ($i = 0; $i < $n; ++$i) {fscanf($stdin, "%s", $students[$i]->name);$students[$i]->scores = array_fill(0, $m, 0);$students[$i]->totalScore = 0;for ($j = 0; $j < $m; ++$j) {fscanf($stdin, "%d", $students[$i]->scores[$j]);$students[$i]->totalScore += $students[$i]->scores[$j];}}fscanf($stdin, "%s", $sortSubject);// 确定排序索引,如果科目不存在,则索引为-1,表示按总分排序$sortIndex = -1;for ($i = 0; $i < $m; ++$i) {if ($subjects[$i] == $sortSubject) {$sortIndex = $i;break;}}// 根据排序索引进行排序usort($students, function($a, $b) use ($sortIndex) {return compareStudents($a, $b, $sortIndex);});// 输出排序后的学生名字foreach ($students as $student) {echo $student->name . " ";}echo PHP_EOL;
}main();
JS代码实现
const { Your_function } = require(‘Your_script’);// 学生信息结构体
class Student {constructor(name, scores) {this.name = name;this.scores = scores;this.totalScore = this.calculateTotalScore();}calculateTotalScore() {let totalScore = 0;for (let score of this.scores) {totalScore += score;}return totalScore;}
}// 自定义比较函数,用于排序
function compareStudents(a, b, sortIndex) {// 如果排序索引指向总分,则比较总分if (sortIndex === -1) {return (a.totalScore < b.totalScore) || (a.totalScore === b.totalScore && a.name < b.name);}// 否则,比较指定科目的成绩return (a.scores[sortIndex] < b.scores[sortIndex]) || (a.scores[sortIndex] === b.scores[sortIndex] && a.name < b.name);
}async function main() {const [n, m] = await readLine();const subjects = await readLine().join('').split(' ');const students = await Promise.all(Array.from({ length: n }, async (_, i) => {const [name] = await readLine();const scores = await readLine().map(Number);return new Student(name, scores);}));const sortSubject = await readLine().join('');const sortIndex = subjects.indexOf(sortSubject);students.sort((a, b) => {return compareStudents(a, b, sortIndex);});console.log(students.map(student => student.name).join(' '));
}main().catch(error => {console.error(error);process.exit(1);
});
相关文章:
华为OD机试 - 智能成绩表( Python C C++ JavaGo JS PHP)
题目描述 小明是一名新老师,他需要将学生按考试总分或单科分数进行排名。学生的信息包括姓名、科目和对应的分数。帮助小明完成这个任务吧! 输入描述 第一行包含两个整数 n 和 m,分别代表学生人数和科目数量。 0 < n < 1000 < m &…...
训练集,验证集,测试集比例
三者的区别 训练集(train set) —— 用于模型拟合的数据样本。验证集(validation set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。 通常用来在模型迭代训练时…...
Altium Designer(AD)加载常用元器件库到工程图文教程及视频演示
🏡《专栏目录》 目录 视频演示1,概述2,加载方法3,总结视频演示 Altium Designer(AD)加载常用元器件库到工程 欢迎点击浏览更多高清视频演示 1,概述...
Java学习笔记2024/2/8
面向对象 //面向对象介绍 //面向: 拿、找 //对象: 能干活的东西 //面向对象编程: 拿东西过来做对应的事情 //01-如何设计对象并使用 //1.类和对象 //2.类的几个不错注意事项 1. 类和对象 1.1 类和对象的理解 客观存在的事物皆为对象 ,所以我们也常常说万物皆对…...
【安防】三个问题:IPC和ITC主要的差异点和相同点 、影响图像成像效果的因素有哪些、摩尔纹如何产生的和消除方法
问题一、IPC和ITC主要的差异点和相同点 差异点 1、应用场景:IPC主要应用于普通安防监控领域,如广场、商场、公园、写字楼等。它们通常被用于监控室内或有限区域的安全,例如,监控办公室、仓库、门口等。而ITC则主要应用于交通领…...
Windows 安装 MySQL 最新最简教程
Windows 安装 MySQL 最新最简教程 官网地址 https://dev.mysql.com/downloads/mysql/下载 MySQL zip 文件 配置 MySQL1、解压文件 2、进入 bin 目录 搜索栏输入 cmd 回车进入命令行 C:\Users\zhong\Desktop\MySQL\mysql-8.3.0-winx64\mysql-8.3.0-winx64\bin 注意这里是你自己…...
uniapp 本地存储的方式
1. uniapp 本地存储的方式 在uniapp开发中,本地存储是一个常见的需求。本地存储可以帮助我们在客户端保存和管理数据,以便在应用程序中进行持久化存储。本文将介绍uniapp中本地存储的几种方式,以及相关的代码示例。 1.1. 介绍 在移动应用开发…...
25、数据结构/二叉树相关练习20240207
一、二叉树相关练习 请编程实现二叉树的操作 1.二叉树的创建 2.二叉树的先序遍历 3.二叉树的中序遍历 4.二叉树的后序遍历 5.二叉树各个节点度的个数 6.二叉树的深度 代码: #include<stdlib.h> #include<string.h> #include<stdio.h> ty…...
数据结构——D/二叉树
🌈个人主页:慢了半拍 🔥 创作专栏:《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 🏆我的格言:一切只是时间问题。 1.树概念及结构 1.1树的概念 树是一种非线性的…...
redis:七、集群方案(主从复制、哨兵模式、分片集群)和面试模板
redis集群方案 在Redis中提供的集群方案总共有三种(一般一个redis节点不超过10G内存) 主从复制哨兵模式分片集群 主从复制(主从数据同步) replid和offset Replication Id:简称replid,是数据集的标记&a…...
没有事情做 随手写的小程序
Qt 代码包 在百度网盘里 链接: https://pan.baidu.com/s/17yjeAkzi18upfqfD7KxXOQ?pwd6666 dialog.h : #ifndef DIALOG_H #define DIALOG_H#include <QDialog> #include <mythread.h>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclas…...
简单说网络:TCP+UDP
TCP和UPD: (1)都工作在传输层 (2)目的都是在程序之中传输数据 (3)数据可以是文本、视频或者图片(对TCP和UDP来说都是一堆二进制数没有太大区别) 一、区别:一个基于连接一个基于非连接 将人与人之间的通信比喻为进程和进程之前的通信:基本上有两种方式(1)写信;(2)打电话;这…...
Containerd 的前世今生和保姆级入门教程
Containerd 的前世今生 很久以前,Docker 强势崛起,以“镜像”这个大招席卷全球,对其他容器技术进行致命的降维打击,使其毫无招架之力,就连 Google 也不例外。Google 为了不被拍死在沙滩上,被迫拉下脸面&…...
分享78个行业PPT,总有一款适合您
分享78个行业PPT,总有一款适合您 78个行业PPT下载链接:https://pan.baidu.com/s/19UL58I5Z1QZidVrq50v6fg?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…...
VR全景技术可以应用在哪些行业,VR全景技术有哪些优势
引言: VR全景技术(Virtual Reality Panorama Technology)是一种以虚拟现实技术为基础,通过360度全景影像、立体声音、交互元素等手段,创造出沉浸式的虚拟现实环境。该技术不仅在娱乐领域有着广泛应用,还可…...
c#cad 创建-点(六)
运行环境 vs2022 c# cad2016 调试成功 一、代码说明 创建一个点的命令方法。代码的主要功能是在当前活动文档中创建一个点,并将其添加到模型空间块表记录中。 代码的主要步骤如下: 获取当前活动文档、数据库和编辑器对象。使用事务开始创建点的过程…...
【JS逆向八】逆向某企查网站的headers参数,并模拟生成 仅供学习
逆向日期:2024.02.07 使用工具:Node.js 加密方法:未知 / 标准库Hmac-SHA512 文章全程已做去敏处理!!! 【需要做的可联系我】 可使用AES进行解密处理(直接解密即可):AES加…...
Springboot+vue的社区智慧养老监护管理平台设计与实现(有报告),Javaee项目,springboot vue前后端分离项目
演示视频: Springbootvue的社区智慧养老监护管理平台设计与实现(有报告),Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的社区智慧养老监护管理平台设…...
STM32学习笔记——定时器
目录 一、定时器功能概述 1、基本定时器(TIM6&TIM7) 工作原理 时序 2、通用计时器(TIM2&TIM3&TIM4&TIM5) 时钟源 外部时钟源模式1&2 外部时钟源模式2 外部时钟源模式1 定时器的主模式输出 输入捕获…...
Android编程权威指南(第四版)- 第 4 章 UI状态的保存与恢复
文章目录 代码:依赖MainActivityQuizViewModelQuestion知识点代码: 大体是一样的,修改了一些 依赖 implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")MainActivity package com.example.geoquizimport androidx.appcompat.app.AppCompatActivi…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
