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
题意:模拟ACM比赛排名,
在一些队伍中选择几个队伍获奖。接下来是队伍获奖产生的规则:
①只有做出题目的队伍,才能获奖。
②如果选出获奖的队伍中没有女生队伍,那么要将所有女队中排名第一的也要给奖。
③获奖排名,按照输入时的顺序输出队名。
④如果获奖队伍不够,先输出获奖的队伍,剩下的空缺用,奖项数量来代替输出。
例如最后一个样例:只有blue获奖,但是要选出3个队伍,所以剩下两个空缺,用3来代替输出。
⑤是否是女队。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
struct node
{
    char name[30];
    int a,t,p;//依次是是否有女队,出题数,罚时
    int flag;
    int id;//记录序号
}q[10010];
int cmp1(struct node x,struct node y)
{
    if(x.t!=y.t)
        return x.t>y.t;
    else
        return x.p<y.p;
}
int cmp2(struct node x,struct node y)
{
    return x.id<y.id;
}
int main()
{
    int T;
    int icase;
    int n,m,i,j;
    scanf("%d",&T);
    for(icase=1;icase<=T;icase++){
        scanf("%d %d",&n,&m);
        for(i=0;i<n;i++){
            scanf("%s %d %d %d",&q[i].name,&q[i].a,&q[i].t,&q[i].p);
            q[i].id=i;
            q[i].flag=0;
        }
       std:: sort(q,q+n,cmp1);
        int f=0;
        for(i=0;i<m;i++){
            if(q[i].t>0){
                q[i].flag=1;
                if(q[i].a!=0)
                    f=1;
            }
        }
        if(f==0){
            for(i=m;i<n;i++){
                if(q[i].t>0&&q[i].a!=0){
                    q[i].flag=1;
                    break;
                }
            }
        }
        std::sort(q,q+n,cmp2);
        printf("Case %d:\n",icase);
        for(i=0;i<n;i++){
            if(q[i].flag)
                printf("%s\n",q[i].name);
        }
        if(icase<T)
            puts("");
    }
    return 0;
}SDUT 2162-The Android University ACM Team Selection Contest(模拟)
原文:http://blog.csdn.net/u013486414/article/details/44811993