HDU - 3789 奥运排序问题

Description

按要求,给国家进行排名。

Input

有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。

Output

排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
每组数据后加一个空行。

Sample Input

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

Sample Output

1:3
1:1
2:1
1:2

1:1
1:1
#include <iostream>
#include <stdio.h>
#include <algorithm>

using namespace std;

typedef struct{
    int id, gold, medal;
    double pop, ggp, gmp;
}nation;

nation temp[1005], a[1005], b[1005], c[1005], d[1005];
int f[1005];

// 金牌
bool cmp_g(nation a, nation b){
    return a.gold > b.gold;
}
// 奖牌
bool cmp_m(nation a, nation b){
    return a.medal > b.medal;
}
// 人均金牌
bool cmp_ggp(nation a, nation b){
    return a.ggp > b.ggp;
}
// 人均奖牌
bool cmp_gmp(nation a, nation b){
    return a.gmp > b.gmp;
}

int main()
{
    int n, m;
    int r;
    int min_rank, min_mode;
    while (~scanf("%d %d", &n, &m)){
        for (int i = 1; i <= n; i++){
            scanf("%d %d %lf", &temp[i].gold, &temp[i].medal, &temp[i].pop);
            temp[i].id = i-1;
            temp[i].ggp = temp[i].gold / temp[i].pop;
            temp[i].gmp = temp[i].medal / temp[i].pop;
        }
            
        for (int i = 1; i <= m; i++){
            scanf("%d", &f[i]);
            a[i] = b[i] = c[i] = d[i] = temp[f[i]+1];
        }
        sort(a+1, a+m+1, cmp_g);
        sort(b+1, b+m+1, cmp_m);
        sort(c+1, c+m+1, cmp_ggp);
        sort(d+1, d+m+1, cmp_gmp);
        for (int i = 1; i <= m; i++){
            min_rank = 1, min_mode = 1;
            r = 0;
            for (int j = 1; j <= m; j++){
                if (a[j].gold != a[j-1].gold)
                    r = j;
                if (a[j].id == f[i])
                    break;
            }
            min_rank = r;
            for (int j = 1; j <= m; j++){
                if (b[j].medal != b[j-1].medal)
                    r = j;
                if (b[j].id == f[i])
                    break;
            }
            if (r < min_rank)
                min_rank = r, min_mode = 2;
            for (int j = 1; j <= m; j++){
                if (c[j].ggp != c[j-1].ggp)
                    r = j;
                if (c[j].id == f[i])
                    break;
            }
            if (r < min_rank)
                min_rank = r, min_mode = 3;
            for (int j = 1; j <= m; j++){
                if (d[j].gmp != d[j-1].gmp)
                    r = j;
                if (d[j].id == f[i])
                    break;
            }
            if (r < min_rank)
                min_rank = r, min_mode = 4;
            printf("%d:%d\n", min_rank, min_mode);
        }
        printf("\n");
    }
    return 0;
}
发布了359 篇原创文章 · 获赞 371 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/Aibiabcheng/article/details/105353960