现有 n(n≤1000) 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过15个字符的字符串,没有空格)、语文、数学、英语成绩(均为不超过 150 的自然数)。如果某对学生(a,b)的每一
时间: 2023-06-01 14:02:19 浏览: 192
设计一个学生类Student(学生学号、姓名、数学、英语、计算机成绩;)
5星 · 资源好评率100%
### 回答1:
这道题目共有n(n≥1000)个同学参加了期末考试,并且每名同学的信息包括:姓名(不超过15个字符的字符串,没有空格)、语文、数学、英语成绩(均为不超过150的自然数)。如果某对学生(A,B)的每一科成绩都完全相同,则将他们的姓名视为相同的信息。
### 回答2:
题解
这是一道模拟题,需要用到结构体和二维数组。
首先,我们定义一个结构体,用来存储每个学生的信息:姓名和语文、数学、英语三科成绩。
然后,我们定义一个二维数组,用来存储每个学生之间的成绩关系,也就是某对学生(a,b)的每一科成绩都相同。
我们可以用两重循环,遍历每一对学生之间的成绩,判断是否满足条件。如果成绩都相同,就将对应位置上的值设为1。
最后,我们可以再次遍历数组,输出满足条件的学生对。
具体实现见代码:
### 回答3:
题目描述
现有 n(n≤1000) 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过15个字符的字符串,没有空格)、语文、数学、英语成绩(均为不超过 150 的自然数)。如果某对学生(a,b)的每一门课的分数都相同,那么我们认为他们是同分的。
现在请你编写一个程序,统计出同分学生的个数。
输入格式
共n+1行。
第一行是一个整数n。
接下来的n行,每行包含一名学生的信息,格式为:
姓名 语文成绩 数学成绩 英语成绩,中间用空格分隔。
每个学生的姓名是一个非空字符串,由字母和数字组成,长度不超过15个字符。
输出格式
总共输出若干行,每行包括两个姓名,中间用一个空格分隔,表示这两个学生同分。按照姓名的字典序从小到大输出(如果同分的学生有多个,按照学生姓名的字典序从小到大输出)。
每对同分学生之间用一个空行隔开,按照每个学生的姓名的字典序从小到大输出。
输入样例
5
Joe 70 80 90
Mike 80 90 100
Cherry 90 90 90
Lucas 80 60 90
Mary 70 80 90
输出样例
Joe Mary
Mike Lucas
Cherry
解题思路
这是一道比较典型的哈希表的题目。对于这道题目我们可以考虑通过哈希表记录下所有学生每门的分数,并将它们与姓名一起保存,这样就可以通过哈希表直接实现同学分数的统计。由于我们要输出多个同学,且按照字典序列排序,因此我们考虑将哈希表的 key 复制到 string 类型中,对其排序;在此基础上,我们可以顺序遍历这个排好序的 string 数组,将其转化为哈希表的 key 查找出每个 key 对应的学生成绩,排好序之后再顺序遍历输出学生信息即可。
哈希表的建立可以通过 unordered_map 来实现,unordered_map 的 key 为 string 类型,value 类型为结构体,结构体中包括了三个成员变量,分别是语文、数学、英语成绩。
//C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_map>
using namespace std;
enum {
CHINESE = 1,
MATH = 2,
ENGLISH = 3
};
struct Student {
string name;
int chinese;
int math;
int english;
};
bool operator < (const Student& a, const Student& b) {
return a.name < b.name;
}
int main() {
unordered_map<string, Student> map;
int n;
scanf("%d", &n);
char name[16];
int chinese, math, english;
for (int i = 0; i < n; i++) {
scanf("%s%d%d%d", name, &chinese, &math, &english);
map[name] = {name, chinese, math, english};
}
vector<string> key_list;
for (auto index = map.begin(); index != map.end(); index++) {
key_list.push_back(index->first);
}
sort(key_list.begin(), key_list.end());
bool found = false;
for (int i = 0; i < key_list.size(); i++) {
auto& student1 = map[key_list[i]];
for (int j = i + 1; j < key_list.size(); j++) {
auto& student2 = map[key_list[j]];
if (student1.chinese == student2.chinese && student1.math == student2.math
&& student1.english == student2.english) {
printf("%s %s\n", student1.name.c_str(), student2.name.c_str());
found = true;
}
}
if (found) {
putchar('\n');
found = false;
}
}
return 0;
}
时间复杂度
由于排序和查找哈希表操作耗时都是O(n log n) 的,因此最终的时间复杂度就是 O(n^2 log n)
算法提高课的题目求赞:https://www.acwing.com/problem/content/1291/
阅读全文