bLue's Ranklist - Vol.3

Problem Description

上一场比赛结束后,bLue 及时保存了一份比赛的排行榜 (Ranklist)。然而昨天 bLue 打开保存的 Ranklist 一看,发现保存的文件发生了不可描述的错误(貌似 bLue‘s Ranklist 都有毒?),非要强行描述的话,就是他保存的 Ranklist 上只能看到每个人的每道题的解题状态,而且顺序完全错乱了。

崩溃的 bLue 看着崩坏的 Ranklist 一筹莫展。不过他突然想到,马上就到循环赛了,不如再次出一个题让学弟学妹来帮他修复坏掉的 Ranklist,这样他就可以拿 AC 的代码去修复文件了,是不是每次都很相当机智啊 ^_^ 。

Ranklist 的排序规则是这样的:解题数多的靠前,如果解题数相同,则总时间少的靠前。如果两个人的解题数和总时间都相同,则他们的排名也相同。

Input

输入数据有多组(数据组数不超过 10),到 EOF 结束。

每组数据包含多行:

  • 第 1 行是一个整数 n (1 <= n <= 10^5) 和 c (1 <= c <= 10),分别表示 Ranklist 上的人数和这场比赛的题数。
  • 接下来有 n 行,每行表示一个人的信息,包含 c 个用空格隔开的每道题的提交状态。每道题的解题状态表示为 "a/b",其中 a (0 <= a <= 100) 表示此题用了几次提交才通过,b (-1 <= b <= 1000) 表示此题在第几分钟时通过(为 -1 表示此题未提交或未通过)。
Output

对于每组输入,输出 n 行,为重新排序后的 Ranklist。

每行输出均为此 Ranklist 上一个人的信息,包含 3 个整数 r, s, p,分别表示排名、解题数和总时间(在通过题目前的每次错误提交会额外增加 20 分钟的时间,如果是未通过的题,则不计算错误提交导致的罚时)。

Example Input
4 3
1/30 2/25 3/-1
2/21 3/28 5/100
2/10 2/25 6/-1
3/60 5/-1 2/-1
Example Output
1 3 289
2 2 75
2 2 75
4 1 100
Hint

数据量较大,请使用尽量快的排序算法。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
	int ming;
	int ac;
	int fashi;
}ag[100020];
int cmp(const void *a,const void *b)
{
	struct node *x=(struct node *)a;
	struct node *y=(struct node *)b;
	if(x->ac!=y->ac) return (x->ac<y->ac);
	else return (x->fashi>y->fashi);
}
int main()
{
	int n,c,i,j,b,a,s1,s2;
	char g;
	while(scanf("%d%d",&n,&c)!=EOF)
	{
		memset(&ag,0,sizeof(ag));
		for(i=0;i<n;i++)
		{
			for(j=1;j<=c;j++)
			{
				scanf("%d%c%d",&a,&g,&b);
				if(b!=(-1))
				{
					ag[i].ac++;
					ag[i].fashi=ag[i].fashi+b; 
					if(a>1) ag[i].fashi=ag[i].fashi+(20*(a-1));
				}
			}
		}
		qsort(ag,n,sizeof(ag[0]),cmp);
		ag[0].ming=1;
		s2=1;s1=1;
		for(i=1;i<n;i++)
		{
			if((ag[i].ac==ag[i-1].ac)&&(ag[i].fashi==ag[i-1].fashi))
			{
				ag[i].ming=s1;
				s2++;
			}
			else 
			{
				s1=s1+s2;
				ag[i].ming=s1;
				s2=1;
			}
		}
		for(i=0;i<n;i++)
		{
			printf("%d %d %d\n",ag[i].ming,ag[i].ac,ag[i].fashi);
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值