牛客 KY117 奥运排序问题

【题目】

        

输入描述:

有多组数据。 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。 接下来一行给出M个国家号。

输出描述:

排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名方式 如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例 如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4. 每组数据后加一个空行。

示例1

输入:

4 4
4 8 1
6 6 2
4 8 2
2 12 4
0 1 2 3
4 2
8 10 1
8 11 2
8 12 3
8 13 4
0 3

复制输出:

1:3
1:1
2:1
1:2

1:1
1:1

【AC代码】

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct country {
	int id;
	int g;
	int s;
	int p;
}country;
bool com1(country c1, country c2) {
	return c1.g > c2.g;
}
bool com2(country c1, country c2) {
	return c1.s > c2.s;
}
bool com3(country c1, country c2) {
	return (float(c1.g) / float(c1.p)) > (float(c2.g) / float(c2.p));
}
bool com4(country c1, country c2) {
	return (float(c1.s) / float(c1.p)) > (float(c2.s) / float(c2.p));
}
int findRank(vector<country> c, int id ,int w) {
	int i = 0;
	for (; i < c.size(); i++) {
		if (c[i].id == id)
			break;
	}
	if (w == 0) {
		while (i > 0 && c[i - 1].g == c[i].g) {
			i--;
		}
	}
	else if (w == 1) {
		while (i > 0 && c[i - 1].s == c[i].s) {
			i--;
		}
	}
	else if (w == 2) {
		while (i > 0 && (float(c[i - 1].g) / float(c[i - 1].p)) == ((float(c[i].g) / float(c[i].p)))) {
			i--;
		}
	}
	else {
		while (i > 0 && (float(c[i - 1].s) / float(c[i - 1].p)) == ((float(c[i].s) / float(c[i].p)))){
			i--;
		}
	}
	return i + 1;
}
int main() {
	ios::sync_with_stdio(false);
	int n, m;
	vector<country> ct;
	vector<vector<country>> rank;
	while (cin >> n >>m) {
		ct.clear();
		rank.clear();
		for (int i = 0; i < n; i++) {
			country c;
			cin >> c.g >> c.s >> c.p;
			c.id = i;
			ct.push_back(c);
		}
		sort(ct.begin(), ct.end(), com1);
		rank.push_back(ct);
		sort(ct.begin(), ct.end(), com2);
		rank.push_back(ct);
		sort(ct.begin(), ct.end(), com3);
		rank.push_back(ct);
		sort(ct.begin(), ct.end(), com4);
		rank.push_back(ct);
		for (int i = 0; i < m ; i++) {
			int t;
			cin >> t;
			int r = n+1;
			int way = 0;
			for (int u = 0; u < 4; u++) {
				int tt = findRank(rank[u], t , u);
				if (tt < r) {
					r = tt;
					way = u+1;
				}
			}
			cout << r << ":" << way << endl;
		}
		cout << endl;
	}
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值