一道排序模拟题,按总成绩和初试成绩排序,注意如果出现并列排名,并且并列申请人正在申请同一所学校,就算名额满了,学校都要录取。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int v[110],n,m,k;
struct node
{
int ge,gi,id,sum;
int ch[10];
bool operator < (const node &w)
{
if(w.sum != sum) return sum > w.sum;
return ge > w.ge;
}
}e[40010];
int cmp(node a,node b)
{
return a.id < b.id;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i = 0; i < m; i ++) scanf("%d",&v[i]);
for(int i = 0; i < n; i ++)
{
scanf("%d%d",&e[i].ge,&e[i].gi);
e[i].id = i,e[i].sum = e[i].ge + e[i].gi;
for(int j = 0; j < k; j ++) scanf("%d",&e[i].ch[j]);
}
sort(e,e + n);
vector<node>ans[m + 1];
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < k; j ++)
{
int t = e[i].ch[j];//志愿
if(v[t] != 0 || (ans[t].back().sum == e[i].sum && ans[t].back().ge == e[i].ge))
{
if(v[t] != 0) v[t] --;
ans[t].push_back(e[i]);
break;
}
}
}
int f = 0;
for(auto &it : ans)
{
if(f != 0) puts("");
f = 1;
sort(it.begin(),it.end(),cmp);
for(int j = 0; j < it.size(); j ++)
{
if(j != 0) printf(" ");
printf("%d",it[j].id);
}
}
return 0;
}