ZJU-PAT 1080. Graduate Admission (30) 浙大2014年上机复试第四题

来源:互联网 发布:shopex 源码解析 编辑:程序博客网 时间:2024/06/15 23:47
#include<iostream>#include<algorithm>#include<cstdio>#include<vector>using namespace std;const int maxn=40005;const int maxm=101;int n,m,k;int num[maxm];int lastRank[maxm];vector<int> mm[maxm];struct stu{    int id;    int GE,GI,fin;    int pre[6];    int rank;};stu tt[maxn];bool cmp(stu a,stu b){    if(a.fin!=b.fin)        return a.fin>b.fin;    else        return a.GE>b.GE;}void Init(){    scanf("%d%d%d",&n,&m,&k);    for(int i=0; i<m; i++) scanf("%d",&num[i]);    for(int i=0; i<n; i++)    {        scanf("%d%d",&tt[i].GE,&tt[i].GI);        tt[i].fin=(tt[i].GE+tt[i].GI);        tt[i].id=i;        for(int j=0; j<k; j++)        {            scanf("%d",&tt[i].pre[j]);        }    }    sort(tt,tt+n,cmp);    for(int i=0; i<maxm; i++) mm[i].clear();    tt[0].rank=0;    for(int i=1; i<n; i++)    {        if(tt[i].fin==tt[i-1].fin && tt[i].GE==tt[i-1].GE) tt[i].rank=tt[i-1].rank;        else            tt[i].rank=i;    }}void Select(){    for(int i=0; i<n; i++)    {        int curstuid=tt[i].id;        for(int j=0; j<k; j++)        {            int schoolid=tt[i].pre[j];            if(mm[schoolid].size()<num[schoolid])            {                mm[schoolid].push_back(curstuid);                lastRank[schoolid]=tt[i].rank;   //当前学生的排名 非tt[curstuid].rank                break;            }            else if(mm[schoolid].size()>0)            {                /*int laststu=mm[schoolid].back();  错误同上所述                if(tt[laststu].rank==tt[i].rank)                {                    mm[schoolid].push_back(curstuid);                    break;                }*/                if(tt[i].rank==lastRank[schoolid])                {                    mm[schoolid].push_back(curstuid);                    break;                }            }        }    }}void output(){    for(int i=0; i<m; i++)    {        if(mm[i].size()==0)            printf("\n");        else        {            sort(mm[i].begin(),mm[i].end());            for(int j=0; j<mm[i].size(); j++)            {                if(j==0)printf("%d",mm[i][j]);                else printf(" %d",mm[i][j]);            }            printf("\n");        }    }}int main(){    Init();    Select();    output();    return 0;}

0 0