1080.Graduate Admission

【題意】
        根據學生的成績以及學校的容量確定各學校的錄取情況

【思路】

        記錄學生的各種分數、志願等信息,記錄學校的計劃招生人數、已招學生以及已招的最低排名(保證即使超出了計劃招生容量,後面來的同一排名的學生也能被錄取)等信息,再對學生排個名,最後從前往後一個個看能不能錄取即可


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

typedef struct{
	int id;
	int ge;
	int gi;
	int total;
	int rank;
	vector<int> schools;
}applicant;

typedef struct{
	int quota;
	vector<int> ids;
	int lowestRank;//已錄取的最低名次
}school;

bool cmp(applicant a1, applicant a2){
	if(a1.total>a2.total){
		return 1;
	}
	else if(a1.total==a2.total && a1.ge>a2.ge){
		return 1;
	}
	return 0;
}

int main(int argc, char const *argv[])
{
	vector<applicant> applicants;
	vector<school> schools;
	int n,m,k;

	cin >> n >> m >> k;
	applicants.resize(n);
	schools.resize(m);
	for(int i=0; i<n; i++){
		applicants[i].schools.resize(k);
	}
	for(int i=0; i<m; i++){
		cin >> schools[i].quota;
		schools[i].lowestRank = 1;
	}
	for(int i=0; i<n; i++){
		cin >> applicants[i].ge >> applicants[i].gi;
		applicants[i].total = applicants[i].ge+applicants[i].gi;
		applicants[i].id = i;
		for(int j=0; j<k; j++){
			cin >> applicants[i].schools[j];
		}
	}
	sort(applicants.begin(),applicants.end(),cmp);
	
	int tmpRank,tmpGe,tmpTotal;
	tmpRank = 0;
	tmpGe = 101;
	tmpTotal = 201;
	for(int i=0; i<n; i++){
		if(!(applicants[i].total==tmpTotal && applicants[i].ge==tmpGe)){
			tmpRank = i+1;
			tmpGe = applicants[i].ge;
			tmpTotal = applicants[i].total;
		}
		applicants[i].rank = tmpRank;

		//看所選的學校能否入取
		for(int j=0; j<k; j++){
			int sid = applicants[i].schools[j];
			if(schools[sid].ids.size()<schools[sid].quota){
				schools[sid].ids.push_back(applicants[i].id);
				schools[sid].lowestRank = applicants[i].rank;
				break;
			}
			else if(schools[sid].lowestRank==applicants[i].rank){
				schools[sid].ids.push_back(applicants[i].id);
				break;
			}
		}
	}

	for(int i=0; i<m; i++){
		sort(schools[i].ids.begin(),schools[i].ids.end());
		for(int j=0; j<schools[i].ids.size(); j++){
			cout << schools[i].ids[j];
			if(j<schools[i].ids.size()-1){
				cout << " ";
			}
		}
		cout << endl;
	}

	system("pause");
	return 0;
}


發佈了99 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章