PAT | A1080 Graduate Admission

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Student{
	int id;
	int examGrade;
	int interviewGrade;
	int totalGrade;
	int volunteer[6];
};

struct School{
	int remainQuota;
	vector<Student> students;
};

bool cmp1(Student a,Student b){
	if(a.totalGrade != b.totalGrade)
		return a.totalGrade > b.totalGrade;
	else if(a.examGrade != b.examGrade)
		return a.examGrade > b.examGrade;
	else
		return a.id < b.id;
}

bool cmp2(Student a,Student b){
	return a.id < b.id;
}

School schools[110];
Student students[40010];

int main(){
	int n,m,k;
	scanf("%d %d %d",&n,&m,&k);
	// n : 申请者数 <= 40000
	// m : 学校数 <= 100
	// k : 每个申请者可填志愿数 <= 5
	for(int i = 0;i < m;i++){
		scanf("%d",&schools[i].remainQuota);
	}
	for(int i = 0;i < n;i++){
		scanf("%d %d",&students[i].examGrade,&students[i].interviewGrade);
		for(int j = 0;j < k;j++){
			scanf("%d",&students[i].volunteer[j]);
		}
		students[i].id = i;
		students[i].totalGrade = students[i].examGrade + students[i].interviewGrade;
	}
	sort(students,students + n,cmp1);
	for(int i = 0;i < n;i++){ // 为每个学生找学校
		for(int j = 0;j < k;j++){ // 遍历该学生的每个志愿
			if(schools[students[i].volunteer[j]].remainQuota > 0){ // 该学校还有名额
				schools[students[i].volunteer[j]].students.push_back(students[i]);
				schools[students[i].volunteer[j]].remainQuota--;
				break;
			}else{ // 该学校没有名额了,看这个学生是不是和该学校录取的最后一个学生总分和考试分数均一样,一样则录取
				if(schools[students[i].volunteer[j]].students[schools[students[i].volunteer[j]].students.size() - 1].totalGrade == students[i].totalGrade
					&&
					schools[students[i].volunteer[j]].students[schools[students[i].volunteer[j]].students.size() - 1].examGrade == students[i].examGrade){
						schools[students[i].volunteer[j]].students.push_back(students[i]);
						break;
				}
			}
		}
	}
	for(int i = 0;i < m;i++){
		int s = schools[i].students.size();
		if(s > 0){ // 这个学校录取到学生了
			sort(schools[i].students.begin(),schools[i].students.end(),cmp2);
			for(int j = 0;j < s;j++){
				if(j != s - 1){
					printf("%d ",schools[i].students[j].id);
				}else{
					printf("%d\n",schools[i].students[j].id);
				}
			}
		}else{
			printf("\n");
		}
	}
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值