在某次竞赛中,判题规则是按解题数从多到少排序,在解题数相同的情况下,按总成绩(保证各不相同)从高到低排序,取排名前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");
}
}
}