• PAT 甲级1025 PAT Ranking (25 分)(结构体排序,第一次超时了,一次sort即可小技巧优化)...


    题意:

    给定一次PAT测试的成绩,要求输出考生的编号,总排名,考场编号以及考场排名。

    分析:

      题意很简单嘛,一开始上来就,一组组输入,一组组排序并记录组内排名,然后再来个总排序并算总排名,结果发现最后一个测试点超时。

      发现自己一开始太傻太盲目,其实只要一次性全部输进来,记录好考场编号,一次排序就可以了。既然只排了一次,怎么计算考场排名呢,这里我用了三个数组

    int g_rank[100];//记录各个考场当前排到的名次 (当前最后一个人的名次)
    int g_score[100];//记录个考场当前排到的最后一个人的分数 
    int g_num[100];//记录个考场当前已经排好队的人数  

    帮助计算考场排名

            //计算分组排名 
            int p=a[i].num;//他属于第p组 
            if(g_rank[p]==0){//如果他是本小组第一名 
                a[i].rank=1;
                g_rank[p]=1;//当前组排到了第几名 
                g_score[p]=a[i].score;//本小组目前排下来最后一名的分数 
                g_num[p]=1;//当前组排到了第几个人 
            }else{
                g_num[p]++;//更新人数 
                if(g_score[p]==a[i].score) {//如果此人与本组的上一人的分数相同 
                    a[i].rank=g_rank[p];//就是本小组上一名的名次             
                }else{//不同的话 
                    a[i].rank=g_num[p];//那么他的名次是本组的人数 
                    g_rank[p]=g_num[p];//更新当前本组最后一人名次 
                    g_score[p]=a[i].score;//更新分数 
                }        
            }

    AC代码:

    #include<bits/stdc++.h> 
    using namespace std;
    struct node{
        string name;
        int score;
        int num;
        int rank;
        int frank;
    }a[30005];
    bool cmp(node x,node y){
        if(x.score==y.score){
            return x.name<y.name;
        }else{
            return x.score>y.score;
        }
    }
    int g_rank[100];//记录各个考场当前排到的名次 (当前最后一个人的名次)
    int g_score[100];//记录个考场当前排到的最后一个人的分数 
    int g_num[100];//记录个考场当前已经排好队的人数  
    int main(){
        int n,k;
        cin>>n;
        int r=1;
        for(int i=1;i<=n;i++){
            cin>>k;
            for(int j=1;j<=k;j++){
                cin>>a[r].name>>a[r].score;
                a[r].num=i;//考场编号 
                r++;
            }
        }
        sort(a+1,a+r,cmp);
        cout<<r-1<<endl;
        memset(g_rank,0,sizeof(g_rank));
        for(int i=1;i<r;i++){
            //全部排名
            if(i==1){
                a[i].frank=1;
            }else{
                    if(a[i].score==a[i-1].score){
                        a[i].frank=a[i-1].frank;
                    }else{
                        a[i].frank=i;
                    }    
            }
            //计算分组排名 
            int p=a[i].num;//他属于第p组 
            if(g_rank[p]==0){//如果他是本小组第一名 
                a[i].rank=1;
                g_rank[p]=1;//当前组排到了第几名 
                g_score[p]=a[i].score;//本小组目前排下来最后一名的分数 
                g_num[p]=1;//当前组排到了第几个人 
            }else{
                g_num[p]++;//更新人数 
                if(g_score[p]==a[i].score) {//如果此人与本组的上一人的分数相同 
                    a[i].rank=g_rank[p];//就是本小组上一名的名次             
                }else{//不同的话 
                    a[i].rank=g_num[p];//那么他的名次是本组的人数 
                    g_rank[p]=g_num[p];//更新当前本组最后一人名次 
                    g_score[p]=a[i].score;//更新分数 
                }        
            }
        }
        for(int i=1;i<r;i++){
            cout<<a[i].name<<" "<<a[i].frank<<" "<<a[i].num<<" "<<a[i].rank<<endl;
        }
        return 0;    
    }
  • 相关阅读:
    c语言,浮点数转byte array
    go的select 只会执行一个case,就会退出select 块
    【转】pphp中goto的用法
    [转]php 中yield是个什么东西
    z-index 0 和auto的区别,这个例子好好琢磨一下
    SpringMVC框架下实现原生分页功能
    Jackson 高级应用
    Jackson 的 基本用法
    Jackson转换为Collection、Array
    spring处理数据库中Date类型字段转换成时间戳问题
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13270678.html
Copyright © 2020-2023  润新知