PAT (Advanced Level) Practice 1080 Graduate Admission (30 分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/84349100

1.总分大的排前
2.Ge大的排前
3.总分和Ge相同时,排名相同
4.根据志愿顺序一个个录取
5.志愿学校招生名额满时,如果和他排名相同的人进了该学校,那么他也能被录取

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

const int N=40000+5;
const int M=100+5;

struct Student
{
    int ge,gi,op[6],id;
    bool operator<(const Student s)const
    {
        if(ge+gi!=s.ge+s.gi) return ge+gi>s.ge+s.gi;
        return ge>s.ge;
    }
}stu[N];

int quota[M],choose[N];
vector<int> G[M];

int same(int x,int y)
{
    return stu[x].ge+stu[x].gi==stu[y].ge+stu[y].gi&&stu[x].ge==stu[y].ge;
}

int main()
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<m;i++)
        scanf("%d",quota+i);
    for(int i=0;i<n;i++)
    {
        stu[i].id=i;
        scanf("%d%d",&stu[i].ge,&stu[i].gi);
        for(int j=0;j<k;j++)
            scanf("%d",&stu[i].op[j]);
    }
    sort(stu,stu+n);
    for(int i=0;i<n;i++)
    {
        int f=0;
        for(int j=0;j<k;j++)
        {
            if(quota[stu[i].op[j]]>0)
            {
                f=1,choose[i]=stu[i].op[j],quota[choose[i]]--;
                break;
            }
            else
            {
                for(int k=i-1;k>=0;k--)
                {
                    if(same(k,i)&&stu[i].op[j]==choose[k])
                    {
                        f=1,choose[i]=stu[i].op[j],quota[choose[i]]--;
                        break;
                    }
                }
                if(f) break;
            }
        }
        if(!f) choose[i]=-1;
    }
    for(int i=0;i<n;i++)
        if(choose[i]!=-1)
            G[choose[i]].push_back(stu[i].id);
    for(int i=0;i<m;i++)
        sort(G[i].begin(),G[i].end());
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<G[i].size();j++)
        {
            if(j!=0) printf(" ");
            printf("%d",G[i][j]);
        }
        puts("");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Nightmare_ak/article/details/84349100