コンピュータプログラミング能力検定(PAT)は、統一されたオンライン試験と自動評価方法により受験者のアルゴリズム設計およびプログラム設計の実装能力を客観的に評価し、コンピュータプログラミングの才能を科学的に評価し、企業の人材を選抜することを目的とした参考基準の提供(URL http:// www.patest.cn)。
各テストは複数の異なるテスト センターで同時に開催され、各テスト センターはローカル エリア ネットワークを使用してテスト センターの結果を生成します。テスト終了後、各テストセンターの結果はすぐに総合ランキング表にまとめられます。
次に、各テストセンターのスコアを自動的に結合し、総合ランキング表を生成するプログラムを作成してください。
入力形式:
入力の最初の行は、テストセンターの総数を表す正の整数 N (≤100) を与えます。次に、N 個のテストセンターの結果が次の形式で表示されます: 最初に、テストセンターの受験者の総数を表す正の整数 K (≤300) が 1 行で表示され、その後に K 行が続き、各行に情報が表示されます。テスト番号 (13 桁の整数) とスコア ([0,100] の範囲の整数) をスペースで区切った、1 つの受験者のデータ。
出力フォーマット:
まず1行目に候補の総数を出力します。次に、要約ランキング テーブルを出力します。各受験者の情報は 1 行を占め、順序はテスト番号、最終順位、テスト センター番号、テスト センターでのランクです。テスト サイトには、入力によって与えられた順序で 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
参照コード:
/**
* 7-14 PAT排名汇总
* 快速排序
*/
#include <stdio.h>
#include <string.h>
struct stu {
char id[14]; //考号
int score; //分数
int kc; //考场
};
struct stu a[30000];
int bigger(const char *s1, const char *s2) {
for (int i = 0; i < 13; i++)
if (s1[i] > s2[i])
return 1;
else if (s1[i] < s2[i])
return 0;
return 1;
}
void qsort(int l, int r) {
if (l >= r)
return;
int i = l;
int j = r;
struct stu t = a[l];
while (i != j) {
while (i < j && (a[j].score < t.score || a[j].score == t.score && bigger(a[j].id, t.id)))
j--;
while (i < j && (a[i].score > t.score || a[i].score == t.score && bigger(t.id, a[i].id)))
i++;
if (i < j) {
struct stu s = a[i];
a[i] = a[j];
a[j] = s;
}
}
a[l] = a[i];
a[i] = t;
qsort(l, i - 1);
qsort(i + 1, r);
return;
}
void Copy(int *b2, int *b1, int n) {
for (int i = 1; i <= n; i++)
b2[i] = b1[i];
}
int main() {
int n, j, i, top = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
int k;
scanf("%d", &k);
for (j = 0; j < k; j++) {
char id[14];
int score;
scanf("%s %d", id, &score);
a[top].score = score;
a[top].kc = i;
strcpy(a[top].id, id);
top++;
}
}
qsort(0, top - 1);
int levall = 1, b1[n + 1], b2[n + 1], score = a[0].score;
for (i = 1; i <= n; i++)
b1[i] = 1, b2[i] = 1;
printf("%d\n", top);
printf("%s %d %d %d\n", a[0].id, 1, a[0].kc, 1);
int llevall = 1; //上一个总排名
levall = 2; //总排名
Copy(b2, b1, n);
b1[a[0].kc]++;
for (i = 1; i < top; i++) {
if (a[i].score == a[i - 1].score) {
printf("%s %d %d %d\n", a[i].id, llevall, a[i].kc, b2[a[i].kc]);
levall++;
b1[a[i].kc]++;
} else {
printf("%s %d %d %d\n", a[i].id, levall, a[i].kc, b1[a[i].kc]);
llevall = levall;
levall++;
Copy(b2, b1, n);
b1[a[i].kc]++; //考场的排名
}
}
return 0;
}