题解 | #奥运排序问题#
奥运排序问题
https://www.nowcoder.com/practice/100a4376cafc439b86f5f8791fb461f3
(可能)最符合题意的屎山
#include <climits> #include <iostream> #include<algorithm> using namespace std; struct Country { int gold;//金牌数 int medal;//奖牌数 int pop;//人口 int no;//国家编号 }; bool cmp1(Country c1, Country c2) {//第一种 return c1.gold > c2.gold; } bool cmp2(Country c1, Country c2) {//第二种 return c1.medal > c2.medal; } bool cmp3(Country c1, Country c2) {//第三种 double cc1 = c1.gold ? (double)c1.gold / (double)c1.pop : 0;//一定要这样强转,不然还是整型 double cc2 = c2.gold ? (double)c2.gold / (double)c2.pop : 0; return cc1 > cc2; } bool cmp4(Country c1, Country c2) {//第四种 double cc1 = c1.medal ? (double)c1.medal / (double)c1.pop : 0; double cc2 = c2.medal ? (double)c2.medal / (double)c2.pop : 0; return cc1 > cc2; } int main() { int n, m; while (cin >> n >> m) { Country c[n]; for (int i = 0; i < n; i++) { cin >> c[i].gold >> c[i].medal >> c[i].pop; c[i].no = i; } int no[m]; for (int i = 0; i < m; i++) cin >> no[i]; for (int i = 0, j = 0; i < n && j < m; i++) {//遍历所有国家 if (no[j] == i) {//在需要排名的国家处停留并排名 int min = INT_MAX; int num; sort(c, c + n, cmp4); for (int k = 0; k < n; k++) { if (c[k].no == no[j]) { double cc1 = c[k].medal ? (double)c[k].medal / (double)c[k].pop : 0; for (int i = 0; i <= k; i++) {//去重 double cc2 = c[i].medal ? (double)c[i].medal / (double)c[i].pop : 0; if (cc1 == cc2) {//找到第一个重复,即为最高排名 if (min >= i) { min = i; num = 4; } } } } } sort(c, c + n, cmp3); for (int k = 0; k < n; k++) { if (c[k].no == no[j]) { double cc1 = c[k].gold ? (double)c[k].gold / (double)c[k].pop : 0; for (int i = 0; i <= k; i++) { double cc2 = c[i].gold ? (double)c[i].gold / (double)c[i].pop : 0; if (cc1 == cc2) { if (min >= i) { min = i; num = 3; } } } } } sort(c, c + n, cmp2); for (int k = 0; k < n; k++) { if (c[k].no == no[j]) { for (int i = 0; i <= k; i++) { if (c[k].medal == c[i].medal) { if (min >= i) { min = i; num = 2; } } } } } sort(c, c + n, cmp1); for (int k = 0; k < n; k++) { if (c[k].no == no[j]) { for (int i = 0; i <= k; i++) { if (c[k].gold == c[i].gold) { if (min >= i) { min = i; num = 1; } } } } } j++;//只有找到前一个需要排名的国家,下标才向后移动 cout << min + 1 << ":" << num << endl; } } cout << endl; } } // 64 位输出请用 printf("%lld")