#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <map>
#include <queue>
#include <math.h>
using namespace std;
struct student
{
int id;
int GE;
int GI;
int total;
int choice[10];
int rank;
}stu[41000];
vector<int> school[110];
int prerank[110]={-1};
int quota[110];
int N,M,K;
bool cmp(student a,student b)
{
if(a.total!=b.total)return a.total>b.total;
else if(a.GE!=b.GE)return a.GE>b.GE;
else return a.id<b.id;
}
int main()
{
scanf("%d%d%d",&N,&M,&K);
for(int i=0;i<M;i++)
{
scanf("%d","a[i]);
}
for(int i=0;i<N;i++)
{
stu[i].id=i;
scanf("%d %d",&stu[i].GE,&stu[i].GI);
stu[i].total=stu[i].GE+stu[i].GI;
for(int j=0;j<K;j++)
{
scanf("%d",&stu[i].choice[j]);
}
}
sort(stu,stu+N,cmp);
stu[0].rank=0;
for(int i=1;i<N;i++)
{
if(stu[i].total==stu[i-1].total&&stu[i].GE==stu[i-1].GE)
{
stu[i].rank=stu[i-1].rank;
}
else
{
stu[i].rank=i;
}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<K;j++)
{
int s=stu[i].choice[j];
if(quota[s]>0)
{
school[s].push_back(stu[i].id);
prerank[s]=stu[i].rank;
quota[s]--;
break;
}
else
{
if(prerank[s]==stu[i].rank)
{
school[s].push_back(stu[i].id);
prerank[s]=stu[i].rank;
quota[s]--;
break;
}
}
}
}
for(int i=0;i<M;i++)
{
if(school[i].size()>0)
{
sort(school[i].begin(),school[i].end());
for(int j=0;j<school[i].size();j++)
{
if(j!=0)printf(" ");
printf("%d",school[i][j]);
}
}
printf("\n");
}
return 0;
}
PAT甲1080 Graduate Admission(30 分)
最新推荐文章于 2023-02-04 19:36:51 发布