天天看點

《算法筆記》題目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
",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
",student[i].id,r,student[i].local_num,student[i].local_rank);
    }
    return 0;
}      

 最後一個點就是過不去≧ ﹏ ≦