AcWing 1566. 研究生入学
原题链接
中等
作者:
巨鹿噜噜噜路
,
2020-05-31 21:43:01
,
所有人可见
,
阅读 654
算法1
C++ 代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX_N = 40010;
const int MAX_M = 110;
struct Students {
int id;
int gE, gI, gF;
int choices[6];
bool operator< (const Students& b) const {
if (gF != b.gF) return gF > b.gF;
else return gE > b.gE;
}
bool operator== (const Students& b) const {
return gF == b.gF && gE == b.gE;
}
}stu[MAX_N];
bool cmp(Students& a, Students& b) {
return a.id < b.id;
}
int quota[MAX_M];
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; i++) {
scanf("%d", "a[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d%d", &stu[i].gE, &stu[i].gI);
for (int j = 0; j < k; j++) {
scanf("%d", &stu[i].choices[j]);
}
stu[i].gF = stu[i].gE + stu[i].gI;
stu[i].id = i;
}
sort(stu, stu + n);
vector<vector<Students>>sch(m);
//学生按排名与志愿进行选学校
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
int schId = stu[i].choices[j];
int last = sch[schId].size() - 1;
//如果学校招生未满 或 学校招的最后一名同学与当前同学排名相同
if (quota[schId] > sch[schId].size()
|| sch[schId][last] == stu[i]) {
sch[schId].push_back(stu[i]);
break;
}
}
}
for (int i = 0; i < m; i++) {
auto& item = sch[i];
//按学生id字母序输出
sort(item.begin(), item.end(), cmp);
for (int j = 0; j < item.size(); j++) {
if (j) printf(" ");
printf("%d", item[j].id);
}
printf("\n");
}
return 0;
}