zoukankan      html  css  js  c++  java
  • PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题
    因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E
    那么按这个优先级顺序进行排序
    每次排序前先求当前课程的排名
    然后再与目前最好的排名比较、更新

    至于查询,建立id与索引的映射即可。

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <map>
    using namespace std;
    const int maxn=2000+5;
    int n,m;
    map<string,int> maps;
    struct Stu{
        char id[10];
        int score[4];
        int ranks;
        int best_rank=5000;
        int c;
    }stu[maxn];
    
    bool cmp1(Stu a,Stu b){
        return a.score[0]>b.score[0];
    }
    bool cmp2(Stu a,Stu b){
        return a.score[1]>b.score[1];
    }
    bool cmp3(Stu a,Stu b){
        return a.score[2]>b.score[2];
    }
    bool cmp4(Stu a,Stu b){
        return a.score[3]>b.score[3];
    }
    
    void solveRanks(int k){
        stu[0].ranks=1;
        if(stu[0].ranks<stu[0].best_rank){
            stu[0].best_rank=stu[0].ranks;
            stu[0].c=k;
        }
        for(int i=1;i<n;i++){
            if(stu[i].score[k]==stu[i-1].score[k]){
                stu[i].ranks=stu[i-1].ranks;
            }
            else{
                stu[i].ranks=i+1;
            }
            if(stu[i].ranks<stu[i].best_rank){
                stu[i].best_rank=stu[i].ranks;
                stu[i].c=k;
            }
        }
    }
    int main()
    {
        scanf("%d %d",&n,&m);
        for(int i=0;i<n;i++){
            scanf("%s %d %d %d",stu[i].id,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
            stu[i].score[3]=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;
        }
        sort(stu,stu+n,cmp4);
        solveRanks(3);
    
        sort(stu,stu+n,cmp1);
        solveRanks(0);
    
        sort(stu,stu+n,cmp2);
        solveRanks(1);
    
        sort(stu,stu+n,cmp3);
        solveRanks(2);
    
        string str;
        for(int i=0;i<n;i++){
            str=stu[i].id;
            maps[str]=i+1;
        }
        char course[4]={'C','M','E','A'};
        for(int i=0;i<m;i++){
            cin>>str;
            int idx=maps[str]-1;
            if(idx==-1)
                printf("N/A
    ");
            else
                printf("%d %c
    ",stu[idx].best_rank,course[stu[idx].c]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    『在线工具』 基于 xsser.me 源码 + BootStrap 前端 的 XSS 平台
    『Python』Python 调用 ZoomEye API 批量获取目标网站IP
    『Python』 多线程 共享变量的实现
    『Python』 多线程 端口扫描器
    打印机PCL漏洞原理分析
    『GitHub』Git常用命令记录
    『Python』爬行搜索引擎结果获得指定主机二级域名及IP信息
    iOS使用Runtime给分类动态绑定属性
    Swift介绍(基于Swift4版本)
    iOS中的block模板
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6727969.html
Copyright © 2011-2022 走看看