AcWing 1566. 研究生入学
原题链接
中等
作者:
O₂
,
2024-04-19 17:56:03
,
所有人可见
,
阅读 2
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=40010,M=110,K=10;
typedef pair<int,int>PII;
int n,m,k,cnt[M];
PII last[M];
struct People{
int id,score1,score2,score;
int schools_id[K];
}persons[N];
bool cmp(People t1,People t2){
if(t1.score!=t2.score) return t1.score>t2.score;
else return t1.score1>t2.score1;
}
int main(){
cin>>n>>m>>k;
for(int i=0;i<m;i++) cin>>cnt[i];
for(int i=0;i<n;i++){
persons[i].id=i;
cin>>persons[i].score1>>persons[i].score2;
persons[i].score=persons[i].score1+persons[i].score2; //可能会出现像 80 81 这种情况,所以不能/2
for(int j=0;j<k;j++) cin>>persons[i].schools_id[j];
}
sort(persons,persons+n,cmp);
memset(last,-1,sizeof last);
vector<vector<int>>res(m);
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
int t=persons[i].schools_id[j];
if(cnt[t]){
cnt[t]--;
res[t].push_back(persons[i].id);
last[t]={persons[i].score,persons[i].score1};
break;
}else if(!cnt[t]){
if(last[t].first==persons[i].score&&last[t].second==persons[i].score1){
res[t].push_back(persons[i].id);
break;
}
}
}
}
for(int i=0;i<m;i++){
sort(res[i].begin(),res[i].end());
for(int j=0;j<res[i].size();j++){
if(!j) cout<<res[i][j];
else cout<<" "<<res[i][j];
}
cout<<endl;
}
return 0;
}