【PTA-A】1080 Graduate Admission

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805387268571136

测试点全过。首先这道题不能使用cin输入,不然第五个测试点是会超时的。然后依然坑点比较多,调了挺久的bug。有几个题目的解读要注意一下。

注意点

1.题意是要按照考生名次录取,一志愿不行继续看他的二志愿。有一些兄弟(比如我)可能一开始会理解成全部先看一志愿,再看二,这样还更麻烦了一点。

2.如果名次相同(总分和ge相同),学校可以破额录取。所以记录一下前一位录取的排名,如果后一位的排名一样,学校也会招收的

3.录取考生编号从小到大排序

4.一个学校没有录取任何学生也要输出换行符。

思路

1.定义两个结构体学校和考生。

考生:id、Ge、Gi、总分total、排名、目标院校choose[5]。

学校:拟录取人数minge、当前录取人数cur_num、录取考生编号数组cur[100001]、录取前一个排名low(默认是0)。

2.cmp函数:先按分数从大到小,再按ge从大到小

3.输入学校名额,输入学生成绩和选择院校,这里保存一下id和总分(因为id后面排序会变)。

4.排序,设置排名

5.学校录取。双层循环,考生一环,目标院校一环。当学校当前录取小于拟录取人数,就直接录取,更新一下学校当前录取考生的名次和录取人数。如果和前一个录取的考生排名相等,也被录取,更新一下录取人数。

6.输出。输出之前要对学校录取的考生序号从小到大排序,如果没有录取也要输出换行。然后注意空格。

#include<iostream>
#include<algorithm>
using namespace std;
struct Student {
	int ge, gi, id;
	double total;
	int choose[5];
	int paiming;
}stu[40005];

struct School {
	int minge;
	int cur_num = 0;
	int cur[100001];
	int low = 0;
}sch[105];

bool cmp(Student a, Student b) {
	if (a.total != b.total)return a.total > b.total;
	else return a.ge > b.ge;
}

int main() {
	int n, m, k;
	cin >> n >> m >> k;
	//拟录取人数
	for (int i = 0; i < m; i++)scanf_s("%d", &sch[i].minge);
	//学生信息
	for (int i = 0; i < n; i++) {
		scanf_s("%d %d", &stu[i].ge, &stu[i].gi);
		stu[i].id = i;
		stu[i].total = (stu[i].ge + stu[i].gi)*1.0 / 2;
		for (int j = 0; j < k; j++) scanf_s("%d", &stu[i].choose[j]);
	}
	//排序
	sort(stu, stu + n, cmp);
	//排名
	stu[0].paiming = 1;
	int temp = 1;
	for (int i = 1; i < n; i++) {
		if (stu[i].total == stu[i - 1].total&&stu[i].ge == stu[i - 1].ge) {
			stu[i].paiming = stu[i - 1].paiming;
			temp++;
		}
		else
			stu[i].paiming = ++temp;
	}
	//学校录取
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < k; j++) {
			//temp存储一下学生当前选择的学校
			int temp = stu[i].choose[j];
			//这里的两个break不要忘了
			//学校有名额直接录取
			if (sch[temp].cur_num < sch[temp].minge) {
				sch[temp].cur[sch[temp].cur_num++] = stu[i].id;
				sch[temp].low = stu[i].paiming;
				break;
			}
			//如果排名相等破例录取
			else if (stu[i].paiming == sch[temp].low) {
				sch[temp].cur[sch[temp].cur_num++] = stu[i].id;
				break;
			}
		}
	}
	//输出
	for (int i = 0; i < m; i++) {
		if (sch[i].cur_num > 1) {
			int temp = sch[i].cur_num;
			sort(sch[i].cur, sch[i].cur + temp);
		}
		for (int j = 0; j < sch[i].cur_num; j++) {
			cout << sch[i].cur[j];
			if (j != sch[i].cur_num - 1)cout << " ";
		}
		cout << endl;
	}
	return 0;
}

 

posted @ 2019-10-01 23:59  大帅本帅  阅读(66)  评论(0)    收藏  举报