文章大意:类似高考志愿录取,不同的时同分(成绩和面试分数都一样)的时候,报的是一个学校的话不管名额有无,都要录取。
易错点:要记得排序以后序号会变,要保存之前的序号;
然后在放入对应的结果集合的时候,放入的是排序前的序号,而我们在进行比较的时候(比较是否和最后一个成绩相同),其实需要的排序以后的序号。详细见代码实现。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct node{
int GE,GI;
int choice[7];
int index;
}node;
node t[40001];
int last[102];//对应学校最后一个录取的排序后序号
int quotas[102]={0};//学校的名额
int n,m,k;
bool cmp(node t1,node t2){
if((t1.GE+t1.GI) != (t2.GE+t2.GI)){
return (t1.GE+t1.GI) > (t2.GE+t2.GI);
}
return t1.GE > t2.GE;
}
vector<int> a[102];
int main(){
cin>>n>>m>>k;
for(int i=0;i<m;++i){
cin>>quotas[i];
}
for(int i=0;i<n;++i){
cin>>t[i].GE>>t[i].GI;
t[i].index=i;
for(int j=0;j<k;++j){
cin>>t[i].choice[j];
}
}
sort(t,t+n,cmp);
for(int i=0;i<n;++i){
for(int j=0;j<k;++j){
if(quotas[t[i].choice[j]] > 0){
a[t[i].choice[j]].push_back(t[i].index);//易错点:放入的是排序前的序号
quotas[t[i].choice[j]]--;
last[t[i].choice[j]]=i;
//易错点:放入的是排序前的序号,而我们在进行比较成绩的时候,其实需要的排序以后的序号
break;
}
if(quotas[t[i].choice[j]] == 0){
if(t[last[t[i].choice[j]]].GE == t[i].GE && t[last[t[i].choice[j]]].GI == t[i].GI){
a[t[i].choice[j]].push_back(t[i].index);
last[t[i].choice[j]]=i;
break;
}
}
}
}
for(int i=0;i<m;++i){
sort(a[i].begin(),a[i].end());
for(int j=0;j<a[i].size();++j){
if(j==0){
cout<<a[i][j];
}else{
cout<<" "<<a[i][j];
}
}
cout<<endl;
}
return 0;
}