bLue's Ranklist - Vol.1
Problem Description
上一场比赛结束后,bLue 及时保存了一份比赛的排行榜 (Ranklist)。然而昨天 bLue 打开保存的 Ranklist 一看,发现保存的文件发生了不可描述的错误,非要强行描述的话,就是他保存的 Ranklist 上只能看到每个人的解题数量和总时间(包括罚时),而且顺序完全错乱了。
崩溃的 bLue 看着崩坏的 Ranklist 一筹莫展。不过他突然想到,马上就到循环赛了,不如正好出一个题让学弟学妹来帮他修复坏掉的 Ranklist,这样他就可以拿 AC 的代码去修复文件了,是不是相当机智啊 ^_^ 。
Ranklist 的排序规则是这样的:解题数多的靠前,如果解题数相同,则总时间少的靠前。如果两个人的解题数和总时间都相同,则他们的排名也相同。
Input
输入数据有多组(数据组数不超过 1000),到 EOF 结束。
每组数据包含多行:
- 第 1 行是一个整数 n (0 < n < 1000),表示 Ranklist 上的人数。
- 接下来有 n 行,每行包含两个整数 s, p (0 <= s < 20, 0 <= p < 10000),分别表示这个人的解题数和总时间(单位为分钟)。
Output
对于每组输入,输出 n 行,为重新排序后的 Ranklist。
每行输出均为此 Ranklist 上一个人的信息,包含 3 个整数 r, s, p,分别表示排名、解题数和总时间。
Example Input
5 6 300 5 185 5 185 5 140 4 120
Example Output
1 6 300 2 5 140 3 5 185 3 5 185 5 4 120
#include <stdio.h> #include <string.h> struct sdut { int a; int b; }; struct sdut s1[1001], st; int main() { int n; while(scanf("%d", &n) != EOF) { int i, j; for(i = 0; i < n; i++) { scanf("%d %d", &s1[i].a, &s1[i].b); } for(i = 0; i < n - 1; i++) { for(j = 0; j < n - i - 1; j++) { if(s1[j].a < s1[j + 1].a) { st = s1[j]; s1[j] = s1[j + 1]; s1[j + 1] = st; } else if(s1[j].a == s1[j + 1].a && s1[j].b > s1[j + 1].b) { st = s1[j]; s1[j] = s1[j + 1]; s1[j + 1] = st; } } } int flag = 1; for(i = 0; i < n; i++) { if(i == 0) { printf("%d %d %d\n", flag, s1[i].a, s1[i].b); } else { if(s1[i].a == s1[i - 1].a && s1[i].b == s1[i - 1].b) { printf("%d %d %d\n", flag, s1[i].a, s1[i].b); } else { printf("%d %d %d\n", i + 1, s1[i].a, s1[i].b); flag = i + 1; } } } } return 0; }