1080. Graduate Admission

#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
    int ge,gi,gf,want[5],no;
    bool operator<(const node&x)const
    {
        if(x.gf!=gf)return gf>x.gf;
        return ge>x.ge;
    }
};
int main()
{
    int cmax[1000],n,m,k;
    cin>>n>>m>>k;
    vector<node>st(n);
    vector<vector<node>>school(m);
    for(int i=0;i<m;++i)
        cin>>cmax[i];
    for(int i=0;i<n;++i)
    {
        cin>>st[i].ge>>st[i].gi;
        st[i].no=i; st[i].gf=(st[i].ge+st[i].gi)/2;
        for(int j=0;j<k;++j)
            cin>>st[i].want[j];
    }
    sort(st.begin(),st.end());
    for(int i=0;i<n;++i)
        for(int j=0;j<k;++j)
        {
            int t=st[i].want[j];
            node y;
            if(school[t].size())
                 y=school[t].back();
            if(school[t].size()<cmax[t]||y.ge==st[i].ge&&y.gf==st[i].gf)
            {
                school[t].push_back(st[i]);
                break;
            }
        }
    for(int i=0;i<m;++i)
    {
        using CN=const node;
        sort(school[i].begin(),school[i].end(),[](CN&x,CN&y){return x.no<y.no;});
        for(int flag=0,j=0;j<school[i].size();++j)
        {
            if(flag)    cout<<' ';
            else flag=1;
            cout<<school[i][j].no;
        }
        cout<<endl;
    }
    return 0;

}
没必要真的求出排名,成绩相同就是排名一样,人脑袋的思路总是会做很多不必要的事

你可能感兴趣的:(1080. Graduate Admission)