题目链接
题目描述
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
题目大意
就是给出一组学生的姓名、学号、成绩,让你输出成绩最高和最低的学生的姓名和学号
本题用到了vector动态数组对结构体进行排序
涉及到了以下知识点
- vector动态数组的初始化
//首先要导入vector的头文件,因为本题直接用的万能头文件,所以不需要单独导入
#include<bits/stdc++.h> //万能头文件
//STL容器的创建方法为 vector<数据类型> 变量名称
vector<int> a; //这就是创建了一个变量名为a的int类型动态数组
//如果想要创建一个关于自定义结构体的数组,则需要先定义一个结构体
struct Node{
int a;
string b;
};
//然后把vector中的数据类型改为结构体即可
vector<Node> v; //创建一个变量名为v,Node类型的动态数组
- vector动态数组的插入操作
//具体操作为:变量名.push_back(vector动态数组中相同的数据类型)
vector<int> v; //创建一个int类型的动态数组
int a = 1;
v.push_back(a); //把int类型的a变量存入动态数组v中
//结构体也是类似
struct Node{
int a;
string b;
};
vector<Node> v;
Node tempNode;
tempNode.a=1;
tempNode.b="hello";
v.push_back(Node); //将Node类型的数据压入动态数组v中
- vector动态数组的排序函数sort
//一般用sort函数来对动态数组v进行排序
//v.begin()代表v的第一个元素(类似于普通数组的a[0]),返回第一个元素的迭代器
//v.end()代表v的最后一个元素,返回最后一个元素的迭代器
//具体格式为sort(开始排序的第一个位置的迭代器,结束排序位置的迭代器,排序函数(第三个变量排序函数在对基础类型进行从小到大排序的时候非必要,可以省略))
sort(v.begin(),v.end(),cmp);
//cmp是自定义的排序函数,基础类型进行从小到大排序的时候非必要,可以省略
- 自定义排序规则cmp函数
struct Node{
int a;
string b;
};
vector<Node> v;
//cmp函数返回类型为bool,需要两个形参,类型为vector数组的类型,返回值是比较大小的结果
bool cmp(Node a,Node b){
return a.a>b.a;
//返回按照结构体中a从大到小的顺序
}
bool cmp(Node a,Node b){
return a.a<b.a;
//返回结构体中a从小到大的顺序
}
注意当重写cmp 函数时,返回值只能存在大于或者小于,不能存在大于等于,小于等于这种情况(不能带等号)
- 动态数组的输出
//v.size()函数返回的是int类型的动态数组大小,代表动态数组v此时有多少个元素
//对于动态数组vector来说,可以理解为普通数组的遍历
struct Node{
int a;
string b;
};
vector<Node> v;
for(int i=0;i<v.size();i++){
cout<<v[i].a<<" "<<v[i].b<<endl;
}
//在STL容器中,仅限于动态数组可以这么遍历,其他的大部分还是要用到迭代器进行遍历,等后续用到后可以再进行讲解
题解
#include<bits/stdc++.h>
using namespace std;
struct Node{ //代表一个学生
string name; //代表学生姓名
string ID; //代表学生学号
int grade; //代表学生成绩
};
vector<Node> v; //定义Node类型的动态数组
bool cmp(Node a,Node b){ //自定义排序函数cmp
return a.grade>b.grade; //注意返回值不能带等号,是大于不是大于等于
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
Node tempNode; //定义存储输入的Node类型数据
cin>>tempNode.name>>tempNode.ID>>tempNode.grade;
v.push_back(tempNode); //接受到输入后压入动态数组中
}
sort(v.begin(),v.end(),cmp); //对动态数组结构体中的grade进行从大到小排序
cout<<v[0].name <<" "<<v[0].ID<<endl;
cout<<v[n-1].name<<" "<<v[n-1].ID<<endl;
//分别输出成绩最高与最低的学生的姓名和学号
}