1025 PAT Ranking (25分)

这题给出了\(PAT\)的排名规则

在结构体类型中存放题目要求的信息(准考证号、分数、考场号以及考场内排名)。

根据题目要求,需要写一个排序函数cmp,规则如下:

  1. 当分数不同时,按分数从大到小排序。
  2. 否则,按准考证号从小到大排序。

而算法本体则分为下面三个部分:

  1. 按考场读入各考生的信息,并对当前读入考场的所有考生进行排序。之后将该考场的所有考生的排名写入他们的结构体中。
  2. 对所有考生进行排序,计算总排名。
  3. 输出所有考生的信息。
const int N=30010;
struct Node {
    string id;
    int score;
    int final_rank;
    int local_number;
    int local_rank;
}a[N];


int n,k;

bool cmp(Node &a, Node &b)
{
    if(a.score == b.score) return a.id < b.id;
    return a.score > b.score;
}

int main()
{
    cin>>n;

    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        cin>>k;

        int l=cnt;
        for(int j=0;j<k;j++)
        {
            cin>>a[cnt].id>>a[cnt].score;
            a[cnt].local_number=i;
            cnt++;
        }
        int r=cnt;

        sort(a+l,a+r,cmp);

        int local_rank=1;
        for(int i=l;i<r;i++)
        {
            if(i > l && a[i].score == a[i-1].score)
                a[i].local_rank = a[i-1].local_rank;
            else a[i].local_rank = local_rank;
            local_rank++;
        }
    }

    cout<<cnt<<endl;

    sort(a,a+cnt,cmp);

    int final_rank=1;
    for(int i=0;i<cnt;i++)
    {
        if(i && a[i].score == a[i-1].score)
            a[i].final_rank = a[i-1].final_rank;
        else a[i].final_rank = final_rank;
        final_rank++;
    }

    for(int i=0;i<cnt;i++)
        cout<<a[i].id<<' '<<a[i].final_rank<<' '<<a[i].local_number<<' '<<a[i].local_rank<<endl;

    //system("pause");
    return 0;
}

\(update on 2021.2.14\)
作了略微的修改:

const int N=30010;
struct Node {
    string id;
    int score;
    int final_rank;
    int local_number;
    int local_rank;
    bool operator<(const Node &W) const
    {
        if(score == W.score) return id < W.id;
        return score > W.score;
    }
}a[N];
int n,k;

int main()
{
    cin>>n;

    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        cin>>k;

        int l=cnt;
        for(int j=0;j<k;j++)
        {
            cin>>a[cnt].id>>a[cnt].score;
            a[cnt].local_number=i;
            cnt++;
        }
        int r=cnt;

        sort(a+l,a+r);

        for(int j=l;j<r;j++)
        {
            if(j > l && a[j].score == a[j-1].score)
                a[j].local_rank = a[j-1].local_rank;
            else a[j].local_rank = j-l+1;
        }
    }

    cout<<cnt<<endl;

    sort(a,a+cnt);

    for(int i=0;i<cnt;i++)
    {
        if(i && a[i].score == a[i-1].score)
            a[i].final_rank = a[i-1].final_rank;
        else a[i].final_rank = i+1;
    }

    for(int i=0;i<cnt;i++)
        cout<<a[i].id<<' '<<a[i].final_rank<<' '<<a[i].local_number<<' '<<a[i].local_rank<<endl;

    //system("pause");
    return 0;
}
posted @ 2021-01-30 20:44  Dazzling!  阅读(47)  评论(0编辑  收藏  举报