思路:
(1)按照成绩从大到小排序,tol相同再比较,EG。
(2)vc[i]数组记录每个数字排序后的序号,然后对vc[i]这个数组进行排序(按照排序前的序号大小)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100100;
struct Node{
int EG,IG,tol,id,rk;
int choi[10];
}cur[maxn];
bool cmp(Node a,Node b)
{
if(a.tol!=b.tol) return a.tol>b.tol;
else return a.EG>b.EG;
}
bool ccp(int x,int y)
{
if(cur[x].id!=cur[y].id) return cur[x].id<cur[y].id;
}
int sch[20];
vector <int> vc[maxn];
int main(void)
{
int n,m,k,i,j,x,y;
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<m;i++) scanf("%d",&sch[i]);
for(i=0;i<n;i++){
scanf("%d%d",&cur[i].EG,&cur[i].IG);
cur[i].tol=cur[i].EG+cur[i].IG;
cur[i].id=i;
for(j=1;j<=k;j++) scanf("%d",&cur[i].choi[j]);
}
sort(cur,cur+n,cmp);
for(i=0;i<n;i++){
if(i!=0&&cur[i].tol==cur[i-1].tol&&cur[i].EG==cur[i-1].EG) cur[i].rk=cur[i-1].rk;
else cur[i].rk=i+1;
for(j=1;j<=k;j++){
x=cur[i].choi[j];
if(vc[x].size()<sch[x]){
vc[x].push_back(i);break;
}
else{
y=vc[x][vc[x].size()-1];
if(cur[i].rk==cur[y].rk){
vc[x].push_back(i);break;
}
}
}
}
for(i=0;i<m;i++){
if(vc[i].size()>0){
sort(vc[i].begin(),vc[i].end(),ccp);
for(j=0;j<vc[i].size();j++){
if(j) printf(" ");
printf("%d",cur[vc[i][j]].id);
}
}
printf("\n");
}
return 0;
}