PAT (Advanced Level) 1080. Graduate Admission (30)

简单题。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

struct X
{
    int id;
    int ge,gi;
    int ch[200];
}s[40000+10];
int n,m,k;
int sch[200];
vector<int>ans[200];
int le[200],li[200];

bool cmp(const X&a,const X&b)
{
    if(a.ge+a.gi==b.ge+b.gi) return a.ge>b.ge;
    return a.ge+a.gi>b.ge+b.gi;
}

int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;i++) scanf("%d",&sch[i]);
    for(int i=1;i<=n;i++)
    {
        s[i].id=i-1;
        scanf("%d%d",&s[i].ge,&s[i].gi);
        for(int j=1;j<=k;j++)
        {
            scanf("%d",&s[i].ch[j]);
            s[i].ch[j]++;
        }
    }
    sort(s+1,s+1+n,cmp);

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            if(sch[s[i].ch[j]]>0)
            {
                sch[s[i].ch[j]]--;
                ans[s[i].ch[j]].push_back(s[i].id);
                le[s[i].ch[j]]=s[i].ge;
                li[s[i].ch[j]]=s[i].gi;
                break;
            }
            if(le[s[i].ch[j]]==s[i].ge&&li[s[i].ch[j]]==s[i].gi)
            {
                sch[s[i].ch[j]]--;
                ans[s[i].ch[j]].push_back(s[i].id);
                le[s[i].ch[j]]=s[i].ge;
                li[s[i].ch[j]]=s[i].gi;
                break;
            }
        }
    }

    for(int i=1;i<=m;i++)
    {
        sort(ans[i].begin(),ans[i].end());
        for(int j=0;j<ans[i].size();j++)
        {
            printf("%d",ans[i][j]);
            if(j<ans[i].size()-1) printf(" ");
        }
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5636191.html