1080. Graduate Admission (30)

本文介绍了一种处理学校录取问题的算法,通过为每所学校分配额外变量记录最后被录取学生的排名,并以此来判断后续相同排名的学生是否可以被录取。该算法使用C++实现,包括学生和学校的数据结构定义及主要逻辑。

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

    在处理超出学校名额的情况仍然有可能录取的情况时,为每个学校加入一个变量以指示最后一个录入同学的排名,当后来的同学与这个排名相同时则不再考虑是否名额不够。

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

using namespace std;

struct School{
	int quota;
	int rank;  // the last one's rank
	vector<int> admits;

	School() : quota(0), rank(-1){}
};

struct Student{
	int id, ge, gi, final, rank;
	vector<int> choices;

	Student(int id, int ge, int gi, vector<int> c) : id(id), ge(ge), gi(gi), final((ge+gi)/2), choices(c){}

	bool operator < (const Student& rhs) const{
		if(final != rhs.final) return final > rhs.final;
		else return ge > rhs.ge;
	}
};

int main(){
	int n, m, k;
	scanf("%d%d%d", &n, &m, &k);

	vector<School> schools(m);
	for(int i = 0; i < m; ++i){
		scanf("%d", &schools[i].quota);
	}

	vector<Student> stus;
	for(int i = 0; i < n; ++i){
		int ge, gi;
		vector<int> c(k);

		scanf("%d%d", &ge, &gi);
		for(int j = 0; j < k; ++j){
			scanf("%d", &c[j]);
		}

		stus.emplace_back(i, ge, gi, c);
	}

	sort(begin(stus), end(stus));

	for(size_t i = 0; i < stus.size(); ++i){
		if(i == 0) stus[i].rank = 1;
		else{
			if(stus[i].final == stus[i-1].final && stus[i].ge == stus[i-1].ge){
				stus[i].rank = stus[i-1].rank;
			}else{
				stus[i].rank = i+1;
			}
		}
	}

	for(auto& s : stus){
		for(auto& c : s.choices){
			if(schools[c].quota > 0 || schools[c].rank == s.rank){
				schools[c].admits.push_back(s.id);
				schools[c].quota--;
				schools[c].rank = s.rank;
				break;
			}
		}
	}

	for(auto& s : schools){
		sort(begin(s.admits), end(s.admits));

		bool first = true;
		for(auto& a : s.admits){
			if(first) first = false;
			else printf(" ");
			printf("%d", a);
		}
		printf("\n");
	}



	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值