1.模拟
2.结构体排序
3.个顶序列赋排名
#include<bits/stdc++.h>
using namespace std;
vector<vector<int > > school;
int n,k,c;
struct node{
int id;
int ge,gl;
int sum;
int c_s[5];
};
vector<node > people;
vector<int > w,ranks;
bool cmp(node a,node b){
if(a.sum!=b.sum){
return a.sum > b.sum;
}
return a.ge > b.ge;
}
int main()
{
scanf("%d%d%d",&n,&k,&c);
people.resize(n);
school.resize(k);
w.resize(k);
ranks.resize(n);
for(int i=0;i<k;i++)
scanf("%d",&w[i]);
for(int i=0;i<n;i++){
people[i].id = i;
scanf("%d%d",&people[i].ge,&people[i].gl);
people[i].sum = people[i].ge + people[i].gl;
for(int j = 0;j<c;j++){
scanf("%d",&people[i].c_s[j]);
}
}
sort(people.begin(),people.end(),cmp);
ranks[people[0].id] = 1;
for(int i=1;i<people.size();i++){
if(people[i].sum==people[i-1].sum&&people[i].ge==people[i-1].ge)
ranks[people[i].id] = ranks[people[i-1].id];
else
ranks[people[i].id] = i+1;
}
for(int i=0;i<n;i++){
int stu_id = people[i].id;
for(int j=0;j<c;j++){
int school_id = people[i].c_s[j];
if(school[school_id].size() < w[school_id]){
school[school_id].push_back(stu_id);
break;
}
else if(ranks[stu_id]==ranks[school[school_id][school[school_id].size()-1]]){
school[school_id].push_back(stu_id);
break;
}
}
}
for(int i=0;i<k;i++){
if(school[i].size()==0){
printf("\n");
continue;
}
else{
sort(school[i].begin(),school[i].end());
for(int j=0;j<school[i].size();j++){
if(j!=0) printf(" ");
printf("%d",school[i][j]);
}
printf("\n");
}
}
return 0;
}