获奖(C语言)

在某次竞赛中,判题规则是按解题数从多到少排序,在解题数相同的情况下,按总成绩(保证各不相同)从高到低排序,取排名前60%的参赛队(四舍五入取整)获奖,请确定某个队能否获奖。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试的第一行输入1个整数n(1≤n≤15)和1个字符串ms(长度小于10且不含空格),分别表示参赛队伍总数和想确定是否能获奖的某个队名;接下来的n行输入n个队的解题信息,每行一个1个字符串s(长度小于10且不含空格)和2个整数m,g(0≤m≤10,0≤g≤100),分别表示一个队的队名、解题数、成绩。当然,n个队名中肯定包含ms。

输出格式:

对于每组测试,若某队能获奖,则输出“YES”,否则输出“NO”。引号不必输出。

输入样例:

1
3 team001
team001 2 27
team002 2 28
team003 0 7

输出样例:

YES

 思路分析:

1.先对解题数从大到小排序;

2.再根据解题数的排序,对相同解题数的成绩进行从大到小的局部排序;

3:对前百分之60的数据进行遍历,查看确定的获奖队是否在其中;

4.取排名前60%的参赛队(四舍五入取整);对四舍五入的解决方案;

        将排名前60%的结果用double型变量接收,并再加0.5;将此结果强制转换为int型,结果符合题目要求;

	int n=9;
	double result;
   	result=n*0.6+0.5;    //9*0.6=5.4 
	printf("%d",int(result));    //运行结果为5 



	int n=13;
	double result;
   	result=n*0.6+0.5;    //13*0.6= 7.8
	printf("%d",int(result));    //运行结果为8

#include<stdio.h>
 #include<string.h>
 struct s
 {
 	char name[10];
 	int sum;
 	int grade;
 }stu[16],temp;
 int main()
 {
 	int t,n,k,cnt,k1,flag=0;
 	double result;
 	char name[10];
 	scanf("%d",&t);
 	for(int i=1;i<=t;i++)
 	{
 		flag=0;
	 	scanf("%d",&n);            //信息录入 
	 	getchar();
	 	gets(name);
	 	for(int i=0;i<n;i++)
	 	{
		 	scanf("%s%d%d",stu[i].name,&stu[i].sum,&stu[i].grade);
		 	getchar();
		}
		
		
		for(int i=0;i<n;i++)         //第一步排序 (根据解题数) 
		{
			k=i;
			for(int j=i+1;j<n;j++)
			{
				if(stu[j].sum>stu[k].sum)
				{
					k=j;
				}
			}
			if(k!=i)
			{
				temp=stu[i];
				stu[i]=stu[k];
				stu[k]=temp;
			}
		}
		
		
		for(int i=0;i<n;i++)                //第二步排序(根据成绩) 
		{
			if(stu[i].sum==stu[i+1].sum)
			{
				cnt=0;
				k=i;
				while(stu[i].sum==stu[k].sum)
				{
					cnt++;
					k++;
				}
				
				for(int m=i;m<i+cnt-1;m++)
				{
					k1=m;
					for(int n=m+1;n<i+cnt;n++)
					{
						if(stu[n].grade>stu[k1].grade)
						{
							k1=n;
						}
					}
				if(k1!=m)
				{
					temp=stu[m];
					stu[m]=stu[k1];
					stu[k1]=temp;
				}
				}
				
			} 
		}
			result=n*0.6+0.5;
		for(int i=0;i<int(result);i++)
		{
			if(strcmp(stu[i].name,name)==0)
			{
				flag=1;
				break;
			}
		}	
		if(flag==1)
		{
			printf("YES\n");
			flag=0;
		}	
		else
		{
			printf("NO\n");
		}
	}
 } 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值