题解 | #成绩排序#

#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;
}
全部评论

相关推荐

10-14 21:00
门头沟学院 Java
吃花椒的狸猫:这个人说的倒是实话,特别是小公司,一个实习生哪里来的那么多要求
点赞 评论 收藏
分享
10-30 19:23
已编辑
山东大学(威海) C++
牛至超人:我了个雷 1.实习经历写太长了吧,精简一点,你写那么老多,面试官看着都烦 2.项目经历你放俩竞赛干啥单独拿出来写上几等奖就行了呗 3.一大雷点就是项目经历里的那个课程设计,大家都知道课程设计巨水,不要写课程设计,换一个名字,就叫学生管理系统,面试官问就说是自己做的项目,不要提课程设计的事 4.那个交流经历,简化一下塞到最上面的教育经历里就行了 5.简历尽量一页纸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务