九度oj-1007

题目描述:

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

输入:

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

输出:

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

样例输入:

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

样例输出:

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

1:1
1:1

代码:

#include <iostream>  
#include <algorithm>  

using namespace std;  

const int size = 1005;  

class Country{  
public:  
    double g, j, p;  
    int id;  
}c[size];  

bool cmpg(Country x, Country y){  
return x.g > y.g;  
}  
bool cmpj(Country x, Country y){  
    return x.j > y.j;  
}  
bool cmpgp(Country x, Country y){  
return x.g / x.p > y.g / y.p;  
}  
bool cmpjp(Country x, Country y){  
return x.j / x.p > y.j / y.p;  
}  

int main(){  
int n, m;  
int need[size];  
int rank[size][5];  
while (cin >> n >> m){  
    for (int i = 0; i < n; i++){  
        cin >> c[i].g >> c[i].j >> c[i].p;  
        c[i].id = i;  
    }  
    for (int i = 0; i < m; i++){  
        cin >> need[i];  
    }  

    sort(c, c + n, cmpg);  
    rank[c[0].id][1] = 1;  
    for (int i = 1; i < n; i++){  
        if (c[i].g == c[i - 1].g)  
            rank[c[i].id][1] = rank[c[i - 1].id][1];  
        else  
            rank[c[i].id][1] = i + 1;  
    }  

    sort(c, c + n, cmpj);  
    rank[c[0].id][2] = 1;  
    for (int i = 1; i < n; i++){  
        if (c[i].j == c[i - 1].j)  
            rank[c[i].id][2] = rank[c[i - 1].id][2];  
        else  
            rank[c[i].id][2] = i + 1;  
    }  

    sort(c, c + n, cmpgp);  
    rank[c[0].id][3] = 1;  
    for (int i = 1; i < n; i++){  
        if (c[i].g / c[i].p == c[i - 1].g / c[i - 1].p)  
            rank[c[i].id][3] = rank[c[i - 1].id][3];  
        else  
            rank[c[i].id][3] = i + 1;  
    }  

    sort(c, c + n, cmpjp);  
    rank[c[0].id][4] = 1;  
    for (int i = 1; i < n; i++){  
        if (c[i].j / c[i].p == c[i - 1].j / c[i - 1].p)  
            rank[c[i].id][4] = rank[c[i - 1].id][4];  
        else  
            rank[c[i].id][4] = i + 1;  
    }  

    for (int i = 0; i < m; i++){  
        int min = n + 1, type = 5;  
        for (int t = 1; t <= 4; t++){  
            int tmp = 1;  
            for (int j = 0; j < m; j++){  
                if (i != j){  
                    if (rank[need[i]][t] > rank[need[j]][t]){  
                        tmp++;  
                    }  
                }  
            }  
            if (min > tmp){  
                min = tmp;  
                type = t;  
            }  
        }  
        cout << min << ":" << type << endl;  
    }  
    cout << endl;  
}  
} 

作者提醒

trick:只需要对M个国家进行排名,而不是全部国家进行排名。