PAT甲级 1025 PAT Ranking

原题链接1025 PAT Ranking

题目大意 给定N个考点的学生注册号码和成绩,合并所有考点的数据并排序。

注意 当两个学生的成绩相等时,他们的排名也必须是一样的,并且在排序的时候也要按他们的注册号码排序。

--实现比较器时,比较大小要用“>",不要用">=",否则最后一个测试点会报运行错误

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
struct node{
    string renum;
    int lnum, lrank, grade;
};
bool cmp(node n1, node n2){
    if(n1.grade>n2.grade)
        return true;
    else if(n1.grade==n2.grade){
        return n1.renum<n2.renum;
    }
    else
        return false;
}
vector<node> loc, final;
int main(){
    int n, k, fsize=0;
    scanf("%d\n", &n);
    for(int i=0;i<n;i++){
        scanf("%d\n", &k);
        loc.resize(k);
        final.resize(k+fsize);
        fsize = final.size();
        for(int j=0;j<k;j++){
            cin>>loc[j].renum;
            scanf("%d\n", &loc[j].grade);
        }
        sort(loc.begin(), loc.end(), cmp);
        int lr = 1;
        for(int j=0;j<k;j++){
            if(j!=0&&loc[j].grade!=loc[j-1].grade)  lr=j+1;
            final[fsize-k+j].renum = loc[j].renum;
            final[fsize-k+j].grade = loc[j].grade;
            final[fsize-k+j].lrank = lr;
            final[fsize-k+j].lnum = i+1;
        }
        loc.clear();
    }
    sort(final.begin(), final.end(), cmp);
    printf("%d\n", final.size());
    int frank=1;
    for(int i=0;i<final.size();i++){
        if(i!=0&&final[i].grade!=final[i-1].grade)  frank = i+1;
        cout<<final[i].renum;
        printf(" %d %d %d\n", frank, final[i].lnum, final[i].lrank);
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,268评论 19 139
  • 【我用类似这种小诗的形式分享,我觉得是对260个Kin最浪漫的诠释。希望能为各位提供一个理解260个KIN的另一种...
    77红天行者阅读 427评论 0 1
  • 都没有太大动力来写作了,不知道为什么,似乎变得更加庸俗,缺少了动力源泉。或许需要更多反省。
    聂一一阅读 184评论 0 0
  • 暑假在南京上大学的女儿回家了。 妈妈你可以尝试在简书中写文章,让更多的人认识你。你也可以认识更多喜欢写作的朋友。我...
    下辈子我愿做小草阅读 191评论 0 1