最直观的解法就是四个排序全部进行一次,记录最好的一次输出,解法如下:
#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;
}
}
}
}