7-20 奥运排行榜

每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同。比如中国金牌总数列第一的时候,中国媒体就公布“金牌榜”;而美国的奖牌总数第一,于是美国媒体就公布“奖牌榜”。如果人口少的国家公布一个“国民人均奖牌榜”,说不定非洲的国家会成为榜魁…… 现在就请你写一个程序,对每个前来咨询的国家按照对其最有利的方式计算它的排名。

#include 
#include 
#include 
#include 
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 300;
struct Data {
    int id, a, b;
    double c, d;
}data[maxn];
bool cmp1(const Data &d1, const Data &d2) {
    if (d1.a != d2.a) return d1.a > d2.a;
    return d1.id < d2.id;
}
bool cmp2(const Data &d1, const Data &d2) {
    if (d1.b != d2.b) return d1.b > d2.b;
    return d1.id < d2.id;
}
bool cmp3(const Data &d1, const Data &d2) {
    if (d1.c != d2.c) return d1.c > d2.c;
    return d1.id < d2.id;
}
bool cmp4(const Data &d1, const Data &d2) {
    if (d1.d != d2.d) return d1.d > d2.d;
    return d1.id < d2.id;
}
int n, m, ans[maxn][10];
void solve1(int index) {
    int cnt = 1;
    ans[data[0].id][index] = cnt;
    for (int i = 1; i < n; i++) {
        ++cnt;
        if (data[i].a == data[i-1].a) ans[data[i].id][index] = ans[data[i - 1].id][index];
        else ans[data[i].id][index] = cnt;
    }
}
void solve2(int index) {
    int cnt = 1;
    ans[data[0].id][index] = cnt;
    for (int i = 1; i < n; i++) {
        ++cnt;
        if (data[i].b == data[i-1].b) ans[data[i].id][index] = ans[data[i - 1].id][index];
        else ans[data[i].id][index] = cnt;
    }
}
void solve3(int index) {
    int cnt = 1;
    ans[data[0].id][index] = cnt;
    for (int i = 1; i < n; i++) {
        ++cnt;
        if (data[i].c == data[i-1].c) ans[data[i].id][index] = ans[data[i - 1].id][index];
        else ans[data[i].id][index] = cnt;
    }
}
void solve4(int index) {
    int cnt = 1;
    ans[data[0].id][index] = cnt;
    for (int i = 1; i < n; i++) {
        ++cnt;
        if (data[i].d == data[i-1].d) ans[data[i].id][index] = ans[data[i - 1].id][index];
        else ans[data[i].id][index] = cnt;
    }
}
int main() {
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
        int x, y, z; scanf("%d %d %d", &x, &y, &z);
        data[i].id = i;
        data[i].a = x, data[i].b = y, data[i].c = 1.0*x/(1.0*z), data[i].d = 1.0*y/(1.0*z);
    }
    sort(data, data + n, cmp1); solve1(1);
    sort(data, data + n, cmp2); solve2(2);
    sort(data, data + n, cmp3); solve3(3);
    sort(data, data + n, cmp4); solve4(4);
    for (int kase = 0; kase < m; kase++) {
        int x; scanf("%d", &x);
        int minv = INF, pos = -1;
        for (int i = 1; i <= 4; i++) {
            if (ans[x][i] < minv) { minv = ans[x][i]; pos = i; }
        }
        if (kase) printf(" ");
        printf("%d:%d", minv, pos);
    }
    printf("\n");
    return 0;
}


你可能感兴趣的:(数据结构)