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
1 #include <iostream>
2 #include <string.h>
3 using namespace std; 4 struct Team{ 5 char s[31]; 6 int a,b,c; 7 }team[10001]; 8 bool sel[10001]; 9 void solve(int n,int m,int cnt) //共n个队,输出m个队
10 { 11 int i,j,num=999999999; 12 bool f = false; //是否有女队
13 for(i=1;i<=m;i++){ 14 int Max=0,t; 15 for(j=1;j<=n;j++) //找到最大的
16 if(team[j].b>Max && team[j].b<=num && !sel[j]){ 17 Max = team[j].b; 18 t = j; 19 } 20 num = Max; 21 if(num<1) break; 22 //找到与这个值相等的最小的值
23 for(j=1;j<=n;j++){ 24 if(team[j].b==num && team[j].c<team[t].c && !sel[j]) 25 t = j; 26 } 27 sel[t] = true; 28 if(team[t].a!=0) {f=true;} 29 } 30 if(!f){ //如果没有女队
31 int Max = 0,t; 32 //找到第一个女队
33 for(i=1;i<=n;i++) 34 if(team[i].a!=0 && team[i].b>Max && !sel[j]){ //女队
35 Max = team[i].b; 36 t = i; 37 } 38 //寻找做出这个题数的罚时最少的女队
39 if(Max!=0){ 40 for(i=t;i<=n;i++){ 41 if(team[i].a!=0 && team[i].b==team[t].b && team[i].c<team[t].c) 42 t = i; 43 } 44 sel[t] = true; 45 } 46 } 47 for(i=1;i<=n;i++) 48 if(sel[i]) 49 cout<<team[i].s<<endl; 50 } 51 int main() 52 { 53 int N,i,j; 54 cin>>N; 55 for(i=1;i<=N;i++){ 56 int n,m; 57 memset(sel,0,sizeof(sel)); 58 cin>>n>>m; 59 for(j=1;j<=n;j++) //input
60 cin>>team[j].s>>team[j].a>>team[j].b>>team[j].c; 61 //sort(team+1,team+n+1,cmp);
62 cout<<"Case "<<i<<':'<<endl; 63 solve(n,m,i); 64 if(i<N) cout<<endl; 65 } 66 return 0; 67 } 68
69 /************************************** 70 Problem id : SDUT OJ 2162 71 User name : Miracle 72 Result : Accepted 73 Take Memory : 784K 74 Take Time : 670MS 75 Submit Time : 2014-04-20 12:42:48 76 **************************************/
Freecode : www.cnblogs.com/yym2013