题解 | #成绩排序#
成绩排序
http://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b
#include <bits/stdc++.h>
using namespace std;
struct cmpJiangXu{
bool operator()(const pair<string, int>& a, const pair<string, int>& b){
return a.second > b.second;
}
};
struct cmpShengXu{
bool operator()(const pair<string, int>& a, const pair<string, int>& b){
return a.second < b.second;
}
};
int main(){
int n = 0;
//法一
/*while(cin >> n){
int sortWay = 0; //排序方式
cin >> sortWay;
//输入名字和成绩
vector<pair<string, int>> info;
for(int i = 0; i < n; i++){
string name = "";
int score = 0;
cin >> name >> score;
info.push_back(make_pair(name, score));
}
//排序
//stable的函数可保证相等元素的原本相对次序在排序后保持不变
if(sortWay == 0){
//从高到低 降序
stable_sort(info.begin(), info.end(), cmpJiangXu());
}
else if(sortWay == 1){
//从低到高 升序
stable_sort(info.begin(), info.end(), cmpShengXu());
}
//输出
for(auto iter = info.begin(); iter != info.end(); iter++){
cout << iter->first << " " << iter->second << endl;
}
}*/
//法二
while(cin >> n){
int sortWay = 0; //排序方式
cin >> sortWay;
//输入名字和成绩
map<int, vector<string>> info;
for(int i = 0; i < n; i++){ //建立成绩和名字的映射
string name = "";
int score = 0;
cin >> name >> score;
info[score].push_back(name);
}
//排序
if(sortWay == 0){
//从高到低 降序
//逆序遍历 // rbegin rend
//输出
for(auto iter = info.rbegin(); iter != info.rend(); iter++){ //iter++
for(int i = 0; i < iter->second.size(); i++){ //成绩相同时,按照输入顺序输出
cout << iter->second[i] << " " << iter->first << endl;
}
}
}
else if(sortWay == 1){
//从低到高 升序
//顺序遍历
for(auto iter = info.begin(); iter != info.end(); iter++){ //iter++
for(int i = 0; i < iter->second.size(); i++){
cout << iter->second[i] << " " << iter->first << endl;
}
}
}
}
return 0;
}
华为题库题解 文章被收录于专栏
牛客华为题库的题解