当前位置: 首页 > news >正文

智能成绩表 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

alt

题目描述

小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?

输入描述

第1行输入两个整数,学生人数n和科目数量m。0<n<100,0<m<10

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

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

第n+2行,输入用作排名的科目名称。若科目不存在,则按总分进行排序。

输出描述

输出一行,按成绩排序后的学生名字,空格隔开。成绩相同的按照学生姓名字典顺序排序。

示例1

输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 100 82
shuxue输出:
xiaohua fangfang minmin说明:
按shuxue成绩排名,依次是xiaohua、fangfang、minmin

示例2

输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen输出:
fangfang minmin xiaohua说明:
排序科目不存在,按总分排序,fangfang和minmin总分相同,按姓名的字典顺序,fangfang排在前面

题解

考察多字段排序的基本用法

C++

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;struct Student {string name;vector<int> scores;int totalScore;
};int main() {int n, m;// 输入学生数量(n)和科目数量(m)cin >> n >> m;// 输入各科目名称vector<string> subjects(m);for (string& subject : subjects) cin >> subject;// 输入学生信息,包括姓名、各科成绩和计算总成绩vector<Student> students(n);for (Student& student : students) {cin >> student.name;student.scores.resize(m);for (int& score : student.scores) {cin >> score;student.totalScore += score;}}// 输入要按照哪个科目排序string sortSubject;cin >> sortSubject;// 查找排序的科目在科目列表中的位置auto it = find(subjects.begin(), subjects.end(), sortSubject);int sortIndex = (it != subjects.end()) ? distance(subjects.begin(), it) : -1;// 使用 Lambda 表达式进行排序sort(students.begin(), students.end(), [sortIndex](const Student& a, const Student& b) {if(sortIndex != -1) {   // 按指定的成绩降序排序return a.scores[sortIndex] > b.scores[sortIndex];} else if(a.totalScore != b.totalScore) {   // 按总分降序return a.totalScore > b.totalScore;} else {    // 字典名字排序return a.name < b.name;}});// 输出排序后的学生姓名for (const auto& student : students) cout << student.name << " ";return 0;
}

Java

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;class Student {public String name;public List<Integer> scores = new ArrayList<>();public int totalScore;
}public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 输入学生数量(n)和科目数量(m)int n = scanner.nextInt(), m = scanner.nextInt();// 输入各科目名称List<String> subjects = IntStream.range(0, m).mapToObj(i -> scanner.next()).collect(Collectors.toList());// 输入学生信息,包括姓名、各科成绩和计算总成绩List<Student> students = IntStream.range(0, n).mapToObj(i -> {Student student = new Student();student.name = scanner.next();for (int j = 0; j < m; j++) {int score = scanner.nextInt();student.scores.add(score);student.totalScore += score;}return student;}).collect(Collectors.toList());String sortSubject = scanner.next();int sortIndex = subjects.indexOf(sortSubject);Collections.sort(students, (o1, o2) -> {if (sortIndex != -1) {    // 按指定的成绩降序排序return o2.scores.get(sortIndex) - o1.scores.get(sortIndex);} else if (o1.totalScore != o2.totalScore) {   // 按总分降序return o2.totalScore - o1.totalScore;} else {  // 字典名字排序return o1.name.compareTo(o2.name);}});List<String> collect = students.stream().map(s -> s.name).collect(Collectors.toList());String result = String.join(" ", collect);System.out.println(result);}
}

Python

class Student:def __init__(self):self.name = ""self.scores = []self.total_score = 0# 输入学生数量(n)和科目数量(m)
n, m = map(int, input().split())
# 输入各科目名称
subjects = input().split()# 输入学生信息,包括姓名、各科成绩和计算总成绩
students = []
for _ in range(n):student = Student()stu_split = input().split()student.name = stu_split[0]student.scores = [int(stu_split[i]) for i in range(1, m + 1)]student.total_score = sum(student.scores)students.append(student)sort_subject = input()
sort_index = subjects.index(sort_subject) if sort_subject in subjects else -1
# 使用 Lambda 表达式进行排序
students.sort(key=lambda x: (-x.scores[sort_index] if sort_index != -1 else 0, -x.total_score, x.name))print(" ".join(student.name for student in students))

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

http://www.lryc.cn/news/257069.html

相关文章:

  • 【基于ESP32无线蓝牙上传电脑Excel透传数据】
  • Qt篇——QChartView实现鼠标滚轮缩放、鼠标拖拽平移、鼠标双击重置缩放平移、曲线点击显示坐标
  • 掌握VUE中localStorage的使用
  • 所有行业的最终归宿-我有才打造知识付费平台
  • 图的深度和广度优先遍历
  • 计算机毕业设计JAVA+SSM+springboot养老院管理系统
  • Flutter路由的几种用法
  • 力扣119双周赛
  • Redux,react-redux,dva,RTK
  • 基于Java SSM框架实现高校信息资源共享平台系统【项目源码+论文说明】计算机毕业设计
  • SpringMvc入坑系列(一)----maven插件启动tomcat
  • Leetcode—337.打家劫舍III【中等】
  • 列表标签的介绍与使用
  • 浅谈什么是语音芯片的白噪音支持功能:打造舒适家居与优质音频体验
  • 【QED】高昂的猫 Ⅰ
  • Redis如何做内存优化?
  • 倪海厦:教你正确煮中药,发挥最大药效
  • C++学习笔记:继承
  • 音频/视频、信息和通信技术设备安全标准UL62368-1
  • macos下安装科研绘图软件Origin
  • 安全快速地删除 MySQL 大表数据并释放空间
  • 未使用 “严格模式“(js的问题)
  • Verilog基础:$random系统函数的使用
  • 数据库Delete的多种用法
  • 鸿蒙前端开发-构建第一个ArkTS应用(Stage模型)
  • 从零开始搭建链上dex自动化价差套利程序(12)
  • MySQL 数据库如何实现 XA 规范?
  • SVN修改已提交版本的日志方法
  • ArkUI组件--Text组件
  • mysql的组合查询