甲级PAT 1080 Graduate Admission (30 分)(排序)

测试1,2错误
找了两个多小时,发现里面的节点应该用原来的no也就是ap[i].no,而不是i

if (sc[ap[i].zy[j]][0] > 0||(ki[ap[i].zy[j]]!=1&& ap[ap[i].no].rank == ap[sc[ap[ap[i].no].zy[j]][ki[ap[ap[i].no].zy[j]] - 1]].rank))

最终代码:

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
const int maxn = 40010;
int n;

struct appli {
	int ge, gi, sum;
	int zy[10];
	int rank, no;
	int flag;
}ap[maxn];

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



int main() {
	int m, k, sc[110][10000], ki[110];
	cin >> n >> m >> k;
	for (int i = 0; i < m; i++)
	{
		ki[i] = 1;
		cin >> sc[i][0];
	}
	for (int i = 0; i < n; i++)
	{
		cin >> ap[i].ge >> ap[i].gi;
		ap[i].sum = ap[i].ge + ap[i].gi;
		ap[i].flag = 0; ap[i].no = i;
		for (int j = 0; j < k; j++)
		{
			cin >> ap[i].zy[j];
		}
	}

	sort(ap, ap + n, cmp);

	int rank = 1; ap[0].rank = 1;
	for (int i = 1; i < n; i++)
	{
		if (ap[i].sum != ap[i - 1].sum) { ap[i].rank = rank + 1; rank++; }
		else if (ap[i].ge != ap[i - 1].ge)
		{
			ap[i].rank = rank + 1; rank++;
		}
		else
		{
			ap[i].rank = ap[i - 1].rank; rank++;
		}
	}
	/*for (int i = 0; i < n; i++)
	{
		cout << ap[i].rank << ' ' << ap[i].ge << ' ' << ap[i].gi << ' ';
		for (int j = 0; j < k; j++)
		{
			cout << ap[i].zy[j] << ' ';
		}cout << endl;
	}*/

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < k; j++)
		{
			if (sc[ap[i].zy[j]][0] > 0||(ki[ap[i].zy[j]]!=1&& ap[ap[i].no].rank == ap[sc[ap[ap[i].no].zy[j]][ki[ap[ap[i].no].zy[j]] - 1]].rank))
			{
				sc[ap[i].zy[j]][0]--;
				sc[ap[i].zy[j]][ki[ap[i].zy[j]]++] = ap[i].no;
				ap[i].flag = 1;
				break;
			}

		}
	}	
	set<int> st;
	for (int i = 0; i < m; i++)
	{
		for (int j = 1; j < ki[i]; j++)
		{
			st.insert(sc[i][j]);
		}
		for (set<int>::iterator it = st.begin(); it != st.end(); it++)
		{

			cout << *it; ki[i]--;
			if (ki[i] != 1)
			{
				cout << ' ';
			}
		}
		cout << endl;
		st.clear();
	}

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值