1080. Graduate Admission (30)

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

using namespace std;

struct node
{
	int id, ge, gi, choice[5];
	double finalgrade;
}stu[40010];

int cmp(node n1, node n2)
{
	if(n1.finalgrade != n2.finalgrade)
	{
		return n1.finalgrade > n2.finalgrade;
	}

	return n1.ge > n2.ge;
}

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

	int i, admit[110];
	for(i = 0; i < m; i++)
	{
		scanf("%d", &admit[i]);
	}

	int j;
	for(i = 0; i < n; i++)
	{
		scanf("%d%d", &stu[i].ge, &stu[i].gi);

		for(j = 0; j < k; j++)
		{
			scanf("%d", &stu[i].choice[j]);
		}

		stu[i].id = i;
		stu[i].finalgrade = (stu[i].ge + stu[i].gi) * 1.0 / 2;
	}

	sort(stu, stu + n, cmp);

	int curchoice, former[110], formerindex, flag;
	vector<int> v[110];

	for(i = 0; i < n; i++)
	{
		flag = 0;
		for(j = 0; j < k; j++)
		{
			curchoice = stu[i].choice[j];
			if(admit[curchoice] > 0)
			{
				flag = 1;
			}
			else
			{
				formerindex = former[curchoice];
				if(stu[formerindex].finalgrade == stu[i].finalgrade && stu[formerindex].ge == stu[i].ge)
				{
					flag = 1;
				}
			}

			if(flag == 1)
			{
				admit[curchoice]--;
				former[curchoice] = i;
				v[curchoice].push_back(stu[i].id);
				break;
			}
		}
	}

	int size;
	for(i = 0; i < m; i++)
	{
		sort(v[i].begin(), v[i].end());

		size = v[i].size();
		for(j = 0; j < size; j++)
		{
			if(j > 0)
			{
				printf(" ");
			}

			printf("%d", v[i][j]);
		}

		printf("\n");
	}

	system("pause");
	return 0;
}

 

posted on 2025-11-23 17:18  王景迁  阅读(3)  评论(0)    收藏  举报

导航