PAT (Advanced Level) Practice 1080 Graduate Admission (30 分)
阿新 • • 發佈:2018-11-26
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;
}