华为机试HJ68:成绩排序
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ68:成绩排序相关的知识,希望对你有一定的参考价值。
作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
例示:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
注:0代表从高到低,1代表从低到高
本题含有多组输入数据!
输入描述:
输入多行,先输入要排序的人的个数,然后分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例:
输入:
3 0 fang 90 yang 50 ning 70
输出:
fang 90 ning 70 yang 50
解题思路:
本题是排序题。用vector容器存放学生信息,pair的第一个参数为学生名字,第二个参数为学生分数;用stable_sort对容器排序,自定义排序算法,比较pair的second,也就是比较分数;之后输出student容器内容,完成。
之所以用stable_sort是因为它更稳定,基于归并排序实现,而sort是基于快速排序;stable_sort在处理相同值时不会改变其原本的相对位置,正好符合题意。
测试代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int number;
int flag;
while(cin>>number>>flag)
{
vector<pair<string,int>> student;
for(int i=0;i<number;++i)
{
pair<string,int> temp;
cin>>temp.first;
cin>>temp.second;
student.push_back(temp);
}
if(flag)
{
stable_sort(student.begin(),student.end(), [](const pair<string,int>& v1, const pair<string,int>& v2){
return v1.second < v2.second;
});
}
else{
stable_sort(student.begin(),student.end(), [](const pair<string,int>& v1, const pair<string,int>& v2){
return v1.second > v2.second;
});
}
for(auto it=student.begin();it!=student.end();++it)
{
cout<<(*it).first<<" "<<(*it).second<<endl;
}
}
return 0;
}
以上是关于华为机试HJ68:成绩排序的主要内容,如果未能解决你的问题,请参考以下文章