AC代码:
#include <iostream>
#include <vector>#include <algorithm>
#define MAXK 6
#define MAXA 40001
using namespace std;
typedef struct Applicant{
int Ge; //笔试成绩
double finalGrade; //总成绩
int num; //申请编号(从0~n-1)
int preffer[MAXK]; //第num份(从0开始计数)申请的志愿院校
int school; //最终被录取的学校编号
}Applicant;
bool cmp(const Applicant a, const Applicant b);
Applicant arr[MAXA]; //结构体数组
int n, m, k; //分别表示申请总个数、学校个数、志愿个数
int main(){
//数据预处理
int Ge, Gi;
double finalGrade;
scanf("%d %d %d", &n, &m, &k);
int quato[m]; //记录每个学校的招生人数
for(int i = 0; i < m; i ++){
scanf("%d", &quato[i]);
}
for(int i = 0; i < n; i ++){
scanf("%d %d", &Ge, &Gi);
arr[i].Ge =Ge;
arr[i].finalGrade = 1.0*(Ge + Gi)/2.0;
arr[i].num = i;
for(int j = 0; j < k; j ++){
scanf("%d", &arr[i].preffer[j]);
}
}
//排名
sort(arr, arr + n, cmp);
for(int i = 0; i < n; i ++){
arr[i].school = -1; //初始化未被录取
}
//开始录取
for(int i = 0; i < n; i ++){
for(int j = 0; j < k; j ++){
if(quato[arr[i].preffer[j]]){
quato[arr[i].preffer[j]] --; //每录取一位学生招生人数减去1
arr[i].school = arr[i].preffer[j]; //同时记录该申请编号的最终录取学校编号
break;
}
else { //已到达该学校的录取名额限制时,考虑是否破格录取
if(arr[i - 1].finalGrade == arr[i].finalGrade && arr[i - 1].Ge == arr[i].Ge){
arr[i].school = arr[i - 1].school; //破格录取(由于已经排好序,这里肯定只需要和上一位同学进行比较即可)
break;
}
}
}
}
int flag = 1; //格式化输出用到
//输出结果
for(int i = 0; i < m; i ++){ //对每所学校
vector<int> vtmp;
for(int j = 0; j < n; j ++){
if(arr[j].school == i){
// printf("%d ", arr[j].num);
vtmp.push_back(arr[j].num);
}
}
sort(vtmp.begin(), vtmp.end()); //按照编号从小到大排序输出
flag = 1;
for(int p = 0; p < vtmp.size(); p ++){
if(flag == 1){
printf("%d", vtmp[p]);
flag = 0;
}
else {
printf(" %d", vtmp[p]);
}
}
printf("\n");
}
return 0;
}
bool cmp(const Applicant a, const Applicant b){ //重载比较函数
if(a.finalGrade == b.finalGrade){
return a.Ge > b.Ge;
}
else {
return a.finalGrade > b.finalGrade;
}
}