7-3 奥运排行榜 (25 分)

题目链接

在这里插入图片描述
在这里插入图片描述
简单的排序题,唯一的坑点在于名次并列,例如a考了95分,b考了95分,c考了90分,那么a和b并列第一(名次都是1),然后c的名次为3.

此外还考虑了下c++中double类型如何判断相等的问题,代码中注释部分

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;

struct node {
    int jin;
    int sum;
    int people;
    double av1;
    double av2;
    int first;
    int second;
    int third;
    int fourth;
    int num;
} a[350], b[350];

bool cmp1(node x, node y) { return x.jin > y.jin; }

bool cmp2(node x, node y) { return x.sum > y.sum; }

bool cmp3(node x, node y) { return x.av1 > y.av1; }

bool cmp4(node x, node y) { return x.av2 > y.av2; }

int main(int argc, char const *argv[]) {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        cin >> a[i].jin >> a[i].sum >> a[i].people;
        a[i].av1 = 1.0 * a[i].jin / a[i].people;
        a[i].av2 = 1.0 * a[i].sum / a[i].people;
        a[i].num = i;
    }
    sort(a, a + n, cmp1);
    for (int i = 0; i < n; i++) {
        if (i > 0 && a[i - 1].jin == a[i].jin)//如果金牌数和前面一名的金牌数相等,那么他们的名次也相等(并列名次)
            b[a[i].num].first = b[a[i - 1].num].first;
        else
            b[a[i].num].first = i + 1;
    }
    sort(a, a + n, cmp2);
    for (int i = 0; i < n; i++) {
        if (i > 0 && a[i - 1].sum == a[i].sum)//与上面同理
            b[a[i].num].second = b[a[i - 1].num].second;
        else
            b[a[i].num].second = i + 1;
    }
    sort(a, a + n, cmp3);
    for (int i = 0; i < n; i++) {
        if (i > 0 && abs(a[i - 1].av1 - a[i].av1) < 1e-5)//这里我怕double比较的时候精度出现问题,所以谨慎了一下,但是就这道题来说直接用==也能全对,似乎有点水?
            b[a[i].num].third = b[a[i - 1].num].third;
        else
            b[a[i].num].third = i + 1;
    }
    sort(a, a + n, cmp4);
    for (int i = 0; i < n; i++) {
        if (i > 0 && abs(a[i - 1].av2 - a[i].av2) < 1e-5)//精度问题同上
            b[a[i].num].fourth = b[a[i - 1].num].fourth;
        else
            b[a[i].num].fourth = i + 1;
    }
    bool flag = false;
    while (m--) {
        int x;
        cin >> x;
        if (b[x].first <= b[x].second && b[x].first <= b[x].third &&
            b[x].first <= b[x].fourth)
            if (!flag)
                printf("%d:%d", b[x].first, 1);
            else
                printf(" %d:%d", b[x].first, 1);
        else if (b[x].second <= b[x].first && b[x].second <= b[x].third &&
                 b[x].second <= b[x].fourth)
            if (!flag)
                printf("%d:%d", b[x].second, 2);
            else
                printf(" %d:%d", b[x].second, 2);
        else if (b[x].third <= b[x].first && b[x].third <= b[x].second &&
                 b[x].third <= b[x].fourth)
            if (!flag)
                printf("%d:%d", b[x].third, 3);
            else
                printf(" %d:%d", b[x].third, 3);
        else if (b[x].fourth <= b[x].first && b[x].fourth <= b[x].second &&
                 b[x].fourth <= b[x].third)
            if (!flag)
                printf("%d:%d", b[x].fourth, 4);
            else
                printf(" %d:%d", b[x].fourth, 4);
        flag = true;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值