《算法笔记》题目PAT A1025-PAT Ranking

题目:

 

 题目大意:

输入:考场数、一个考场的选手数、选手的编号和分数

输出:选手的总人数、选手的编号、选手的总排名、选手所在的考场号、选手所在的当地排名(分数相同的排名相同)

思路:定义一个结构体,输入时用sort函数对结构体进行排序,确定选手所在考场的排名;输出时,确定选手的总排名

 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct Student{
    long long id;
    int score;
    int local_num;//考场号
    int local_rank;//地方排名
};
struct Student student[30020];
bool cmp(Student a,Student b)//比较方式,相同分数的按字典序排名
{
    if(a.score!=b.score) return a.score > b.score;
    else return a.id<b.id;
}

int main()
{
    int n,k,num=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&k);
        for(int j=0;j<k;j++)
        {
            scanf("%lld%d",&student[num].id,&student[num].score);
            student[num].local_num=i;
            num++;
        }
        sort(student+num-k,student+num,cmp);//对每个考场的分数进行排序
        student[num-k].local_rank=1;
        for(int j=1;j<k;j++)
        {
            if(student[num-k+j].score==student[num-k+j-1].score)
                student[num-k+j].local_rank=student[num-k+j-1].local_rank;
            else
                student[num-k+j].local_rank=j+1;
        }

    }
    printf("%d\n",num);
    sort(student,student+num,cmp);
    int r=1;
    for(int i=0;i<num;i++)
    {
        if(i>0&&student[i].score!=student[i-1].score)
            r=i+1;
        printf("%lld %d %d %d\n",student[i].id,r,student[i].local_num,student[i].local_rank);
    }
    return 0;
}

 最后一个点就是过不去≧ ﹏ ≦

posted @ 2021-02-01 10:43  inss!w!  阅读(45)  评论(0编辑  收藏  举报