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
坑点是输出排名的时候是按照输入时候的顺序 英语差就是坑
ACcode:
#include <map> #include <queue> #include <cmath> #include <cstdio> #include <cstring> #include <stdlib.h> #include <iostream> #include <algorithm> #define maxn 10010 using namespace std; struct Node{ char s[100]; bool flag; int num; int sorce; int id; void in(){ scanf("%s%d%d%d",&s,&flag,&num,&sorce); } void on(){ printf("%s\n",s); } bool operator<(const Node &a)const{ if(a.num==this->num)return this->sorce<a.sorce; return this->num>a.num; } }my[maxn]; bool cmp(Node a,Node b){return a.id<b.id;} int n,m,loop,t=1,cnt; void doit(){ scanf("%d%d",&n,&m); bool is=false; Node temp; cnt=0; memset(my,0,sizeof(my)); for(int i=0;i<n;++i){ temp.in(); if(temp.num){ my[cnt]=temp; my[cnt].id=cnt; if(my[cnt].flag)is=true; cnt++; } } printf("Case %d:\n",t++); sort(my,my+cnt); int numm=m,mm=m; bool flag=true; sort(my,my+m,cmp); for(int i=0;i<m;++i) if(my[i].num){ if(my[i].flag) flag=false; my[i].on(); numm--; } else break; if(flag&&is) for(int i=mm-1;i<cnt;++i) if(my[i].num&&my[i].flag){ my[i].on(); numm--; break; } while(numm>0){ printf("%d\n",mm); numm--; } printf("\n"); } int main(){ scanf("%d",&loop); while(loop--)doit(); return 0; } /* 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 */