1. 程式人生 > >7-4 PAT排名彙總 (25 分)

7-4 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

思路:直接構建一個詳細的學生結構體陣列,結構體中含有我們所要的資訊,每輸入一組對這一個小組進行排序,然後儲存小組排名,記錄小組的組號,最後在來一次總的排序 ,按總排序輸出每個人的資訊,重點在於維護整個結構體陣列和小組與總體分開排序。

#include<iostream>
#include<vector>
#include<cstdio>
#include<set>
#include<map>
#include<string>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#include<ctype.h>
#include<stack>
#include<queue>
#include<list>
#include<time.h>
#include<sstream>
#define random(x) (rand()%x)
using namespace std;

struct Person{
    string id;      //考號
    int sorce;      //成績
    int groupID;    //所在組
    int groupPM;    //組排名
    int allPM;      //總排名
}per[30005];

bool cmp(Person a,Person b){
    if(a.sorce==b.sorce)    //成績相同按考號排名
        return a.id<b.id;
    return a.sorce>b.sorce; //成績不同按成績排名
}

int main(){
    int n;
    int sum=0;  //不斷更新per的儲存長度
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        for(int j=sum;j<sum+x;j++){
            cin>>per[j].id>>per[j].sorce;
            per[j].groupID=i;    //p[j]號學生組號為i
        }
        sort(per+sum,per+sum+x,cmp);    //組排序
        per[sum].groupPM=1;    //組中第一個人排名置為1
        for(int k=1+sum;k<x+sum;k++){    //這個for是為了確定各組中每個人排名
            if(per[k].sorce==per[k-1].sorce){    //相同的分數有相同的排名,就是並列
                per[k].groupPM = per[k-1].groupPM;
            }
            else{
                per[k].groupPM=k-sum+1;    //分數不同則排名+1
            }
        }
        sum+=x;    //更新per[]實際長度
    }
    //總排名和組排名原理相同
    sort(per,per+sum,cmp);
    per[0].allPM=1;
    for(int i=1;i<sum;i++){
        if(per[i].sorce==per[i-1].sorce){
            per[i].allPM=per[i-1].allPM;
        }
        else{
            per[i].allPM=i+1;
        }
    }
    cout<<sum<<endl;
    for(int i=0;i<sum;i++){
        cout<<per[i].id<<" "<<per[i].allPM<<" "<<per[i].groupID<<" "<<per[i].groupPM<<endl;
    }
    return 0;
}