The Android University ACM Team Selection Contest
Time Limit: 1000MS Memory limit: 65536K
题目描述
To be selected, one team has to solve at least one problem in the contest. The the top M teams who solved at least one problem are selected (If there are less than M teams solving at least one problem, they are all selected).
There is an bonus for the girls - if top M teams contains no all-girls teams,the highest ranked all-girls team is also selected (together with the M top teams), provided that they have solved at least one problem.
Recall that in an ACM/ICPC style contest, teams are ranked as following:
1. The more problems a team solves, the higher order it has.
2. If multiple teams have the same number of solved problems, a team with a smaller penalty value has a higher order than a team with a
larger penalty value.
Given the number of teams N, the number M defined above, and each team's name, number of solved problems, penalty value and whether it's an all-girls team, you are required to write a program to find out which teams are selected.
输入
Each test case begins with a line contains two integers, N (1 <= N <=10^4) and M (1 <= M <= N), separated by a single space. Next will be N lines, each of which gives the information about one specific competing team.Each of the N lines contains a string S (with length at most 30, and consists of upper and lower case alphabetic characters) followed by three integers, A(0 <= A <= 10), T (0 <= T <= 10) and P (0 <= P <= 5000), where S is the name of the team, A indicates whether the team is an all-girls team (it is not an all-girls team if Ai is 0, otherwise it is an all-girls team). T is the number of problems the team solved, and P is the penalty value of the team.
The input guarantees that no two teams who solved at least one problem have both the same T and P.
输出
示例输入
3 5 3 AU001 0 0 0 AU002 1 1 200 AU003 1 1 30 AU004 0 5 500 AU005 0 7 1000 2 1 BOYS 0 10 1200 GIRLS 10 1 290 3 3 red 0 0 0 green 0 0 0 blue 0 1 30
示例输出
Case 1: AU003 AU004 AU005 Case 2: BOYS GIRLS Case 3: blue 3 3
提示
来源
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
char name[35];
int sex,b,c,num;
} h[100010];
int cmp1(const void *p,const void *q)
{
if(((struct node *)p)->b-((struct node *)q)->b==0)
return(((struct node *)p)->c-((struct node *)q)->c);
else
return(((struct node *)q)->b-((struct node *)p)->b);
}
int cmp2(const void *p,const void *q)
{
return(((struct node *)p)->num-((struct node *)q)->num);
}
int main()
{
int t,n,m,i,k,g;
while(~scanf("%d",&t))
{
for(k=1; k<=t; k++)
{
g=0;
scanf("%d%d",&n,&m);
for(i=0; i<n; i++)
{
scanf("%s%d%d%d",h[i].name,&h[i].sex,&h[i].b,&h[i].c);
h[i].num=i;
if(h[i].b)
g=1;
}
qsort(h,n,sizeof(h[0]),cmp1);
qsort(h,m,sizeof(h[0]),cmp2);
printf("Case %d:\n",k);
for(i=0; i<m; i++)
{
if(h[i].b)
{
printf("%s\n",h[i].name);
if(h[i].sex)
g=0;
}
}
if(g)
{
for(i=0; i<n; i++)
{
if(h[i].sex)
{
printf("%s\n",h[i].name);
break;
}
}
}
printf("\n");
}
}
return 0;
}