• 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
  • 相关阅读:
    【异常】org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '**' not found.的解决办法
    java如何进行字符串拼接?
    poj2352消防站
    NOIP第7场模拟赛题解
    转载:
    usaco 2010年3月银组题解
    Js 向json对象中添加新元素
    List<T>中 GetRange (int index, int count)的使用
    C# string格式的日期时间字符串转为DateTime类型
    C# DataTable转List<T>--利用反射
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6727969.html
Copyright © 2020-2023  润新知