最高分数的学生姓名
题目描述
输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓名。
输入格式
第一行输入一个正整数 N N N( N ≤ 100 N \le 100 N≤100),表示学生人数。
接着输入 N N N 行,每行包括两个整数,代表分数姓名。
分数是一个非负整数,且小于等于 100 100 100;
姓名为一个连续的字符串,中间没有空格,长度不超过 20 20 20。
数据保证所有同学的姓名都不同,而且最高分只有一位同学。
输出格式
获得最高分数同学的姓名。
样例 #1
样例输入 #1
5
87 lilei
99 hanmeimei
97 lily
96 lucy
77 jim
样例输出 #1
hanmeimei
提示
hanmeimei 的分数最高 99 99 99 分。
方法1
解题思路:
本题要求我们找出获得最高分数的学生的姓名。我们可以按照以下步骤解决:
- 读取学生人数 N N N。
- 定义变量
maxScore
和maxName
分别存储当前找到的最高分数和对应的学生姓名。 - 循环读取
N
N
N 次,每次读取一位学生的分数和姓名:
- 如果当前学生的分数大于
maxScore
,更新maxScore
为当前分数,并将maxName
更新为当前学生的姓名。
- 如果当前学生的分数大于
- 循环结束后,
maxName
即为获得最高分数的学生的姓名。 - 输出
maxName
。
C++代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
int N;
cin >> N;
int maxScore = -1;
string maxName;
for (int i = 0; i < N; i++) {
int score;
string name;
cin >> score >> name;
if (score > maxScore) {
maxScore = score;
maxName = name;
}
}
cout << maxName << endl;
return 0;
}
代码解释:
- 首先,我们使用
cin
读取学生人数N
。 - 然后,我们定义两个变量:
maxScore
:存储当前找到的最高分数,初始值设为-1
。maxName
:存储获得最高分数的学生的姓名。
- 我们使用
for
循环读取 N N N 次,每次读取一位学生的分数和姓名:- 使用
cin
读取当前学生的分数score
和姓名name
。 - 如果当前学生的分数
score
大于maxScore
,更新maxScore
为当前分数,并将maxName
更新为当前学生的姓名。
- 使用
- 循环结束后,
maxName
即为获得最高分数的学生的姓名。 - 最后,我们使用
cout
输出maxName
。
复杂度分析:
- 时间复杂度: O ( N ) O(N) O(N),其中 N N N 为学生人数。我们需要读取 N N N 次学生的分数和姓名。
- 空间复杂度: O ( 1 ) O(1) O(1)。我们只使用了常数级别的额外空间来存储最高分数和对应的学生姓名。
输入输出样例:
输入:
5
87 lilei
99 hanmeimei
97 lily
96 lucy
77 jim
输出:
hanmeimei
该解决方案通过循环读取每位学生的分数和姓名,并不断更新最高分数和对应的学生姓名。最终,我们得到了获得最高分数的学生的姓名。
方法2
解题思路:
这里提供另一种解决方案,使用结构体来存储学生的分数和姓名,然后在读取输入的同时更新最高分学生的信息。
- 定义结构体
Student
,包含学生的分数score
和姓名name
。 - 读取学生人数 N N N。
- 定义变量
maxStudent
存储当前找到的最高分学生的信息。 - 循环读取
N
N
N 次,每次读取一位学生的分数和姓名:
- 使用结构体变量
currentStudent
存储当前学生的信息。 - 如果当前学生的分数大于
maxStudent
的分数,更新maxStudent
为当前学生。
- 使用结构体变量
- 循环结束后,
maxStudent
即为获得最高分数的学生的信息。 - 输出
maxStudent
的姓名。
C++代码:
#include <iostream>
#include <string>
using namespace std;
struct Student {
int score;
string name;
};
int main() {
int N;
cin >> N;
Student maxStudent{-1, ""};
for (int i = 0; i < N; i++) {
Student currentStudent;
cin >> currentStudent.score >> currentStudent.name;
if (currentStudent.score > maxStudent.score) {
maxStudent = currentStudent;
}
}
cout << maxStudent.name << endl;
return 0;
}
代码解释:
- 定义结构体
Student
,包含学生的分数score
和姓名name
。 - 使用
cin
读取学生人数N
。 - 定义变量
maxStudent
存储当前找到的最高分学生的信息,初始化分数为-1
,姓名为空字符串。 - 使用
for
循环读取 N N N 次,每次读取一位学生的分数和姓名:- 使用结构体变量
currentStudent
存储当前学生的信息。 - 使用
cin
读取当前学生的分数currentStudent.score
和姓名currentStudent.name
。 - 如果当前学生的分数大于
maxStudent
的分数,更新maxStudent
为当前学生。
- 使用结构体变量
- 循环结束后,
maxStudent
即为获得最高分数的学生的信息。 - 使用
cout
输出maxStudent.name
,即最高分学生的姓名。
复杂度分析:
- 时间复杂度: O ( N ) O(N) O(N),其中 N N N 为学生人数。我们需要读取 N N N 次学生的分数和姓名。
- 空间复杂度: O ( 1 ) O(1) O(1)。我们使用了结构体来存储学生的信息,但只需要常数级别的额外空间。
输入输出样例:
输入:
5
87 lilei
99 hanmeimei
97 lily
96 lucy
77 jim
输出:
hanmeimei
这种解决方案使用结构体来存储学生的分数和姓名,可以更加清晰地表示学生的信息。在读取输入的同时,我们直接更新最高分学生的信息,避免了额外的变量声明。