牛客网 KY117 奥运排序问题

最直观的解法就是四个排序全部进行一次,记录最好的一次输出,解法如下:

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

class country {
public:
	int gold;
	int medal;
	int population;

	int num;						//国家编号

	float gold_population;			//金牌人口比例
	float medal_population;			//奖牌人口比例

	int rank[5];					//记录各情况下排名

	bool output;					//标记是否输出

};


bool cmp_gold(country a, country b) {
	return a.gold > b.gold;
}
bool cmp_medal(country a, country b) {
	return a.medal > b.medal;
}
bool cmp_gp(country a, country b) {
	return a.gold_population > b.gold_population;
}
bool cmp_mp(country a, country b) {
	return a.medal_population > b.medal_population;
}
bool cmp_num(country a, country b) {
	return a.num < b.num;
}

country all[250];

int main()
{
	int n, m;
	while (cin >> n >> m) {
		if (n == 0) break;
		
		for (int i = 0; i < n; ++i) {
			cin >> all[i].gold >> all[i].medal >> all[i].population;
			all[i].gold_population = (float)all[i].gold / (float)all[i].population;
			all[i].medal_population = (float)all[i].medal / (float)all[i].population;
			all[i].num = i;								//记录国家编号,方便最后按需输出
			all[i].output = false;
		}

		for (int i = 0; i < m; ++i) {
			int num;
			cin >> num;
			all[num].output = true;				//要求输出排序则置标记为true
		}

		sort(all, all + n, cmp_gold);		//按金牌总数排序
		int k = 1;
		for (int i = 0; i < n; ++i) {
			if (i > 0 && all[i].gold != all[i - 1].gold) {
				k = i + 1;
				all[i].rank[1] = k;
			}
			else {
				all[i].rank[1] = k;
			}
		}

		sort(all, all + n, cmp_medal);			//按奖牌总数排序
		k = 1;
		for (int i = 0; i < n; ++i) {
			if (i > 0 && all[i].medal != all[i - 1].medal) {
				k = i + 1;
				all[i].rank[2] = k;
			}
			else {
				all[i].rank[2] = k;
			}
		}

		sort(all, all + n, cmp_gp);			//按金牌人口比例排序
		k = 1;
		for (int i = 0; i < n; ++i) {
			if (i > 0 && all[i].gold_population != all[i - 1].gold_population) {
				k = i + 1;
				all[i].rank[3] = k;
			}
			else {
				all[i].rank[3] = k;
			}
		}

		sort(all, all + n, cmp_mp);			//按奖牌人口比例排序
		k = 1;
		for (int i = 0; i < n; ++i) {
			if (i > 0 && all[i].medal_population != all[i - 1].medal_population) {
				k = i + 1;
				all[i].rank[4] = k;
			}
			else {
				all[i].rank[4] = k;
			}
		}

		sort(all, all + n, cmp_num);			//再按国家顺序排序
		for (int i = 0; i < n; ++i) {
			if (all[i].output) {
				int r = all[i].rank[1], method = 1;			//找最好的输出
				for (int j = 2; j < 5; ++j) {
					if (all[i].rank[j] < r) {
						r = all[i].rank[j];
						method = j;
					}
				}
				cout << r << ":" << method << endl;
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值