記錄學生的各種分數、志願等信息,記錄學校的計劃招生人數、已招學生以及已招的最低排名(保證即使超出了計劃招生容量,後面來的同一排名的學生也能被錄取)等信息,再對學生排個名,最後從前往後一個個看能不能錄取即可
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct{
int id;
int ge;
int gi;
int total;
int rank;
vector<int> schools;
}applicant;
typedef struct{
int quota;
vector<int> ids;
int lowestRank;//已錄取的最低名次
}school;
bool cmp(applicant a1, applicant a2){
if(a1.total>a2.total){
return 1;
}
else if(a1.total==a2.total && a1.ge>a2.ge){
return 1;
}
return 0;
}
int main(int argc, char const *argv[])
{
vector<applicant> applicants;
vector<school> schools;
int n,m,k;
cin >> n >> m >> k;
applicants.resize(n);
schools.resize(m);
for(int i=0; i<n; i++){
applicants[i].schools.resize(k);
}
for(int i=0; i<m; i++){
cin >> schools[i].quota;
schools[i].lowestRank = 1;
}
for(int i=0; i<n; i++){
cin >> applicants[i].ge >> applicants[i].gi;
applicants[i].total = applicants[i].ge+applicants[i].gi;
applicants[i].id = i;
for(int j=0; j<k; j++){
cin >> applicants[i].schools[j];
}
}
sort(applicants.begin(),applicants.end(),cmp);
int tmpRank,tmpGe,tmpTotal;
tmpRank = 0;
tmpGe = 101;
tmpTotal = 201;
for(int i=0; i<n; i++){
if(!(applicants[i].total==tmpTotal && applicants[i].ge==tmpGe)){
tmpRank = i+1;
tmpGe = applicants[i].ge;
tmpTotal = applicants[i].total;
}
applicants[i].rank = tmpRank;
//看所選的學校能否入取
for(int j=0; j<k; j++){
int sid = applicants[i].schools[j];
if(schools[sid].ids.size()<schools[sid].quota){
schools[sid].ids.push_back(applicants[i].id);
schools[sid].lowestRank = applicants[i].rank;
break;
}
else if(schools[sid].lowestRank==applicants[i].rank){
schools[sid].ids.push_back(applicants[i].id);
break;
}
}
}
for(int i=0; i<m; i++){
sort(schools[i].ids.begin(),schools[i].ids.end());
for(int j=0; j<schools[i].ids.size(); j++){
cout << schools[i].ids[j];
if(j<schools[i].ids.size()-1){
cout << " ";
}
}
cout << endl;
}
system("pause");
return 0;
}