1025. PAT Ranking (25)

来源:互联网 发布:网络机柜布线 编辑:程序博客网 时间:2024/06/06 02:19

题目链接:https://www.patest.cn/contests/pat-a-practise/1025


题目大意:给定N组学生,将N组学生按成绩分别进行组内排序和整体排序,输出每个学生的整体名次,组别,组内名次


解题思路:

  • 注意处理分数相同的名次相同

代码如下:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;struct P{    long long id;    int grade,group,frank,lrank;};bool cmp1(P p1,P p2){//按分数递减排序,同分的按学号递增    if(p1.grade==p2.grade)        return p1.id<p2.id;    else        return p1.grade>p2.grade;}int main(int argc, char const *argv[]){    int n,k,cnt=0,cur=0;    cin>>n;    P st[30010];    for(int i=0;i<n;i++){        cin>>k;        for(int j=0;j<k;j++){            scanf("%013lld %d",&st[cnt].id,&st[cnt].grade);            st[cnt].group=i+1;//组别            cnt++;        }        sort(st+cur,st+cur+k,cmp1);//cur为当前这一组的第一个人的下标        st[cur].lrank=1;        for(int j=1;j<k;j++){/*处理本组的组内的排名*/            if(st[cur+j].grade==st[cur+j-1].grade)                st[cur+j].lrank=st[cur+j-1].lrank;            else                st[cur+j].lrank=j+1;        }        cur+=k;    }    sort(st,st+cnt,cmp1);    st[0].frank=1;    for(int i=1;i<cnt;i++){/*处理最终的排名*/        if(st[i].grade==st[i-1].grade)            st[i].frank=st[i-1].frank;        else            st[i].frank=i+1;    }    cout<<cnt<<endl;    for(int i=0;i<cnt;i++)        printf("%013lld %d %d %d\n",st[i].id,st[i].frank,st[i].group,st[i].lrank);    return 0;}
原创粉丝点击