hdu 1084 (水,排序)

本文介绍了一种用于比赛成绩排序及评分的算法实现。该算法通过存储不同做题数量的参赛者下标并按提交时间排序来确定最终排名,进而给出相应的分数。由于原始数据不可更改,因此采用了额外数组来辅助处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接


有点恶心的排序,不能改变原来的下表,得用四个数组分别存做题数为4,2,3,1的下表,并且在求排名是,要对下班进行排序(还好数据小可以用冒泡)。。


#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct node
{
	int p,t,mark;
}A[101];
int cmp(const void*a,const void*b)
{
	return *((int*)a)-*((int*)b);
}
void fun(int *a,int n)
{
	int i,j,t;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(A[a[j]].t<A[a[i]].t)
			{
				t=a[i];
				a[i]=a[j];
				a[j]=t;
			}
		}
	}

	for(i=0;i<n;i++)
		A[a[i]].mark=i+1;
}
int main()
{
	int i;
	//数组ai存做题数为i的学生的下标,li为长度
	int a1[101],l1;
	int a2[101],l2;
	int a3[101],l3;
	int a4[101],l4;
	int n,h,m,s,p;
	while(scanf("%d",&n),n>0)
	{
		l1=l2=l3=l4=0;
		for(i=0;i<n;i++)
		{
			scanf("%d %d:%d:%d",&p,&h,&m,&s);
			A[i].p=p;
			A[i].t=h*3600+m*60+s;
			if(p==4)a4[l4++]=i;
			if(p==3)a3[l3++]=i;
			if(p==2)a2[l2++]=i;
			if(p==1)a1[l1++]=i;
		}
		fun(a1,l1);
		fun(a2,l2);
		fun(a3,l3);
		fun(a4,l4);
		for(i=0;i<n;i++)
		{
			if(A[i].p==5)printf("100\n");
			else if(A[i].p==0)printf("50\n");
			else if(A[i].p==4)
			{
				if(A[i].mark<=l4/2)printf("95\n");
				else printf("90\n");
			}
			else if(A[i].p==3)
			{
				if(A[i].mark<=l3/2)printf("85\n");
				else printf("80\n");
			}
			else if(A[i].p==2)
			{
				if(A[i].mark<=l2/2)printf("75\n");
				else printf("70\n");
			}
			else if(A[i].p==1)
			{
				if(A[i].mark<=l1/2)printf("65\n");
				else printf("60\n");
			}
		}
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值