版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}