天天看點

7-15 PAT排名彙總 (25 分)

計算機程式設計能力考試(Programming Ability Test,簡稱PAT)旨在通過統一組織的線上考試及自動評測方法客觀地評判考生的算法設計與程式設計實作能力,科學的評價計算機程式設計人才,為企業選拔人才提供參考标準(網址http://www.patest.cn)。

每次考試會在若幹個不同的考點同時舉行,每個考點用區域網路,産生本考點的成績。考試結束後,各個考點的成績将即刻彙總成一張總的排名表。

現在就請你寫一個程式自動歸并各個考點的成績并生成總排名表。

輸入格式:

輸入的第一行給出一個正整數N(≤100),代表考點總數。随後給出N個考點的成績,格式為:首先一行給出正整數K(≤300),代表該考點的考生總數;随後K行,每行給出1個考生的資訊,包括考号(由13位整數字組成)和得分(為[0,100]區間内的整數),中間用空格分隔。

輸出格式:

首先在第一行裡輸出考生總數。随後輸出彙總的排名表,每個考生的資訊占一行,順序為:考号、最終排名、考點編号、在該考點的排名。其中考點按輸入給出的順序從1到N編号。考生的輸出須按最終排名的非遞減順序輸出,獲得相同分數的考生應有相同名次,并按考号的遞增順序輸出。

輸入樣例:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
           

輸出樣例:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4
           

題解:根據題目要求選擇正确的排序方法即可,如果id用longlong記錄的話,注意輸出的時候補夠13位,不然最後一個點會WA。如果用string來标記id的話就不用考慮那麼多了,還是就這個點讓我Wa啊啊啊啊啊~~

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int r;
    long long id;
    int grade;
    int pos;
    int rank;
} q[31111],b[303];
int cmp(node r,node s)
{
    if(r.grade==s.grade)
        return r.id<s.id;
    return r.grade>s.grade;
}
int main()
{
    int t,n,sum=0;
    cin>>t;
    for(int k=1; k<=t; k++)
    {
        cin>>n;
        for(int i=1; i<=n; i++)
        {
            cin>>b[i].id>>b[i].grade;
        }
        sort(b+1,b+1+n,cmp);
        for(int i=1; i<=n; i++)
        {
            if(i>=2&&b[i].grade==b[i-1].grade)
                b[i].rank=b[i-1].rank;
            else
                b[i].rank=i;
        }
        for(int i=sum+1; i<=sum+n; i++)
        {
            q[i].id=b[i-sum].id;
            q[i].grade=b[i-sum].grade;
            q[i].rank=b[i-sum].rank;
            q[i].pos=k;
        }
        sum=sum+n;
    }
    sort(q+1,q+1+sum,cmp);
    for(int i=1; i<=sum; i++)
    {
        if(i>=2&&q[i].grade==q[i-1].grade)
            q[i].r=q[i-1].r;
        else
            q[i].r=i;
    }
    cout<<sum<<endl;
    for(int i=1; i<=sum; i++)
    {
        if(i>=2&&q[i].grade==q[i-1].grade)
            cout<<setw(13)<<setfill('0')<<q[i].id<<" "<<q[i].r<<" "<<q[i].pos<<" "<<q[i].rank<<endl;
        else
            cout<<setw(13)<<setfill('0')<<q[i].id<<" "<<q[i].r<<" "<<q[i].pos<<" "<<q[i].rank<<endl;
    }
    return 0;
}