【题目】
输入描述:
有多组数据。 第一行给出国家数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;
}