AcWing 1566. 研究生入学
原题链接
中等
作者:
leo123456
,
2020-08-31 12:18:33
,
所有人可见
,
阅读 450
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 40010, M = 110, K = 5;
int n, m, k;
int cnt[M]; //每个学校最多录取的人
vector<int> uty[M]; //每个学校录取的人
int s_rank[M];//记录学校已经录取的最后一名学生的排名
struct Person
{
int id,rank;
int ge, gi,total;
int wish[K];
}p[N];
bool cmp (Person& a, Person& b)
{
if(a.total==b.total)
return a.ge>b.ge; //不能写if不能,否则没有返回,因为可能并列
return a.total>b.total;
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; i ++ ) scanf("%d", &cnt[i]);
for (int i = 0; i < n; i ++ )
{
p[i].id = i;
scanf("%d%d", &p[i].ge, &p[i].gi);
p[i].total=p[i].ge+p[i].gi;
for (int j = 0; j < k; j ++ )
scanf("%d", &p[i].wish[j]);
}
sort(p, p + n,cmp);
p[0].rank=1;
for(int i = 1;i<n;i++)
{
if(p[i].total==p[i-1].total&&
p[i].ge==p[i-1].ge)
p[i].rank = p[i-1].rank;
else p[i].rank = i+1;
}
for(int i=0;i<n;i++) //从第一名看学生
{
for(int t=0;t<k;t++) //依次看学生自愿
{
int top=p[i].wish[t];
if(uty[top].size()<cnt[top]||s_rank[top]==p[i].rank)
{
uty[top].push_back(p[i].id);
s_rank[top]=p[i].rank; //更新学校录取最后一名学生的排名
break;
}
}
}
for (int i = 0; i < m; i ++ )//输出
{
if (uty[i].size())
{
sort(uty[i].begin(), uty[i].end());
printf("%d", uty[i][0]);
for (int j = 1; j < uty[i].size(); j ++ )
printf(" %d", uty[i][j]);
}
printf("\n");
}
return 0;
}