1. 程式人生 > >7-6 PAT排名彙總

7-6 PAT排名彙總

計算機程式設計能力考試(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

比賽的時候想著難道要為每個考點都設一個結構體陣列,然後排序,最後合併?簡直太傻了。。(=_=),直接放在一個數組中就行,按考點段排序,最後輸出總名次的時候直接一次排序就ok,總之很簡單啦。。

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>

const int N = 3e4;

struct stu {
    int place;      //考點編號
    char id[15];    //考號
    int score;      //
分數 int order; //考點名次 int ord; //總名次 }; int cmp(stu a, stu b) { if(a.score != b.score) return a.score > b.score; return strcmp(a.id, b.id) < 0; } int main() { int n, num[110]; stu ss[N]; scanf("%d", &n); int t = 0, sum = 0; for(int i = 1; i <= n; i++) { scanf("%d", &num[i]); sum += num[i]; for(int j = 0; j < num[i]; j++) { ss[t].place = i; scanf("%s%d", ss[t].id, &ss[t].score); ss[t].order = 0; t++; } std::sort(ss + t - num[i], ss + t, cmp); int cnt = 1; ss[t-num[i]].order = 1; for(int j = t - num[i] + 1; j < t; j++) { if(ss[j].score == ss[j-1].score) { ss[j].order = ss[j-1].order; cnt++; } else { cnt++; ss[j].order = cnt; } } } std::sort(ss, ss + t, cmp); int cnt = 1; ss[0].ord = 1; printf("%d\n", sum); printf("%s %d %d %d\n", ss[0].id, ss[0].ord, ss[0].place, ss[0].order); for(int i = 1; i < t; i++) { if(ss[i].score == ss[i-1].score) { ss[i].ord = ss[i-1].ord; cnt++; } else { cnt++; ss[i].ord = cnt; } printf("%s %d %d %d\n", ss[i].id, ss[i].ord, ss[i].place, ss[i].order); } return 0; }