当前位置: 代码迷 >> 综合 >> bLue's Ranklist - Vol.1 oj
  详细解决方案

bLue's Ranklist - Vol.1 oj

热度:98   发布时间:2024-01-14 23:11:49.0

bLue's Ranklist - Vol.1

Time Limit: 1000MS Memory Limit: 65536KB
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 <stdlib.h>
struct
{int s,p;
}a[1010],t;
int main()
{int n,i,j,m,flag,x;while(scanf("%d",&n) != EOF){for(i =0;i <n;i++){scanf("%d%d",&a[i].s,&a[i].p);}for(i = 0;i <n;i++){for(j = 0;j < n-i-1;j++){if(a[j].s < a[j+1].s||(a[j].s==a[j+1].s&&a[j].p>a[j+1].p)){t = a[j];a[j] = a[j+1];a[j+1] = t;}}}m = 0;x =0;for(i = 0;i <n;i++){if(i > 0&&a[i].s==a[i-1].s&&a[i].p==a[i-1].p){flag = 1;x++;}else{if(flag)m+=x;m++;flag = 0;x = 0;}printf("%d %d %d\n",m,a[i].s,a[i].p);}}return 0;
}