题解 | #奥运排序问题#

奥运排序问题

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")
全部评论
我以为这个已经够屎山了,没想到上一个更是重量级
点赞
送花
回复
分享
发布于 01-27 23:53 福建

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务