#include <iostream> #include <cstdio> #include <algorithm> using namespace std; /* * 国家 */ struct Country { int goldMedal; //金牌数 int medal; //奖牌总数 int population; //人口 int initOrder; //国家号 int goldMedalRank; // int medalRank; int ratio4GoldMedalAndPopulationRank; int ratio4MedalAndPopulationRank; }; /** * 金牌总数排序 * @param x * @param y * @return */ bool compareByGoldMedal(Country x, Country y) { return x.goldMedal > y.goldMedal; } /** * 奖牌总数排序 * @param x * @param y * @return */ bool compareByMedal(Country x, Country y) { return x.medal > y.medal; } /** * 金牌人口比例排序 * @param x * @param y * @return */ bool compareByRatio4GoldMedalAndPopulation(Country x, Country y) { double xRatio = x.goldMedal * 1.0 / x.population; double yRatio = y.goldMedal * 1.0 / y.population; return xRatio > yRatio; } /** * 奖牌人口排序 * @param x * @param y * @return */ bool compareByRatio4MedalAndPopulation(Country x, Country y) { double xRatio = x.medal * 1.0 / x.population; double yRatio = y.medal * 1.0 / y.population; return xRatio > yRatio; } /** * 按初始顺序排序 * @param x * @param y * @return */ bool compareByInitOrder(Country x, Country y) { return x.initOrder < y.initOrder; } /** * 奥运排序问题--北京大学 * @return */ int main() { int n; //国家数 int m; //要求排名的国家树 while (cin >> n >> m) { Country* country = new Country[n]; for (int i = 0; i < n; ++i) { country[i].initOrder = i; cin >> country[i].goldMedal >> country[i].medal >> country[i].population; } int* waitSort = new int[m]; for (int j = 0; j < m; ++j) { cin >> waitSort[j]; } /* * 对金牌数进行排序 */ sort(country, country + n, compareByGoldMedal); //排序后的第一个排名就是1 country[0].goldMedalRank = 1; for (int i = 1; i < n; ++i) { if (country[i - 1].goldMedal == country[i].goldMedal) { //金牌总数相同,则排名相同 country[i].goldMedalRank = country[i - 1].goldMedalRank; } else { //金牌总数不同,则排名变为 i+1 country[i].goldMedalRank = i + 1; } } /* * 对奖牌总数进行排序 */ sort(country, country + n, compareByMedal); country[0].medalRank = 1; for (int i = 0; i < n; ++i) { if (country[i - 1].medal == country[i].medal) { country[i].medalRank = country[i - 1].medalRank; } else { country[i].medalRank = i + 1; } } /* * 对金牌人口比例进行排序 */ sort(country, country + n, compareByRatio4GoldMedalAndPopulation); country[0].ratio4GoldMedalAndPopulationRank = 1; for (int i = 0; i < n; ++i) { if (1.0 * country[i].goldMedal / country[i].population == 1.0 * country[i - 1].goldMedal / country[i - 1].population) { country[i].ratio4GoldMedalAndPopulationRank = country[i - 1].ratio4GoldMedalAndPopulationRank; } else { country[i].ratio4GoldMedalAndPopulationRank = i + 1; } } /* * 对奖牌人口比例进行排序 */ sort(country, country + n, compareByRatio4MedalAndPopulation); country[0].ratio4MedalAndPopulationRank = 1; for (int i = 0; i < n; ++i) { if (1.0 * country[i].medal / country[i].population == 1.0 * country[i - 1].medal / country[i - 1].population) { country[i].ratio4MedalAndPopulationRank = country[i - 1].ratio4MedalAndPopulationRank; } else { country[i].ratio4MedalAndPopulationRank = i + 1; } } /* * 将序列按initOrder排序,即回归原本的序列 * 输出需要排序的国家 * 输出四种排名中最小的一个 */ sort(country, country + n, compareByInitOrder); for (int i = 0; i < m; ++i) { int index = waitSort[i]; Country cur = country[index]; int r1 = cur.goldMedalRank; int r2 = cur.medalRank; int r3 = cur.ratio4GoldMedalAndPopulationRank; int r4 = cur.ratio4MedalAndPopulationRank; if (r1 <= r2 && r1 <= r3 && r1 <= r4) { cout << r1 << ":" << 1 << endl; } else if (r2 <= r3 && r2 <= r4 && r2 <= r1) { cout << r2 << ":" << 2 << endl; } else if (r3 <= r4 && r3 <= r2 && r3 <= r1) { cout << r3 << ":" << 3 << endl; } else { cout << r4 << ":" << 4 << endl; } } cout << endl; } return 0; }