PAT Graduate Admission

本文提供了一个AC代码示例,用于模拟高校招生过程。通过输入学生的笔试成绩、面试成绩及志愿选择等信息,程序能够根据设定的规则对学生进行排序,并确定每位学生的录取情况。代码实现了学生的数据结构定义、比较函数定制、排序及录取逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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; 
}
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值