PTA 7-20(排序) 奥运排行榜(25 分) 25分代码 结构体排序

博客内容介绍了如何处理PTA题目7-20的奥运排行榜问题,通过四种不同的排序方式对运动员成绩进行排序,并在每次查询时对比不同排序的结果。强调了代码实现和结构体在排序中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按照4种方式排序

每次查询都对四种方式分别查询

然后比较

(注:博客作为交流使用,切勿抄袭应付作业)


#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;
const int maxn = 233;

int n, m;

struct node {
    int id;
    int au, al, p;
    double d1, d2;
}a[maxn], b[maxn], c[maxn], d[maxn];
bool cmp1(node a, node b) {
    if(a.au == b.au) return a.id < b.id;
    return a.au > b.au;
}
bool cmp2(node a, node b) {
    if(a.al == b.al) return a.id < b.id;
    return a.al > b.al;
}
bool cmp3(node a, node b) {
    return a.d1 > b.d1;
}
bool cmp4(node a, node b) {
    return a.d2 > b.d2;
}
//bool cmp3(node a, node b) {
//    if(a.au*b.p == a.p*b.au) return a.id < b.id;
//    return a.au*b.p > a.p*b.au;
//}
//bool cmp4(node a, node b) {
//    if(a.al*b.p == a.p*b.al) return a.id < b.id;
//    return a.al*b.p > a.p*b.al;
//}

int main() {
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; ++i) {
        a[i].id = b[i].id = c[i].id = d[i].id = i;
        scanf("%d %d %d", &a[i].au, &a[i].al, &a[i].p);
        a[i].d1 = 1.0*a[i].au/a[i].p, a[i].d2 = 1.0*a[i].al/a[i].p;
        b[i].au = c[i].au = d[i].au = a[i].au;
        b[i].al = c[i].al = d[i].al = a[i].al;
        b[i].p = c[i].p = d[i].p = a[i].p;
        b[i].d1 = c[i].d1 = d[i].d1 = a[i].d1;
        b[i].d2 = c[i].d2 = d[i].d2 = a[i].d2;
    }
    sort(a, a+n, cmp1);
    sort(b, b+n, cmp2);
    sort(c, c+n, cmp3);
    sort(d, d+n, cmp4);

    for(int i = 0; i < m; ++i) {
        int dd;
        scanf("%d", &dd);
        if(i) printf(" ");
        int id = 1000, cc;
        for(int j = 0; j < n; ++j) {
            if(a[j].id == dd) {
                while(j >= 1 && a[j].au == a[j-1].au) {
                    j--;
                }
                if(j < id) { id = j; cc = 1; }
                break;
            }
        }
        for(int j = 0; j < n; ++j) {
            if(b[j].id == dd) {
                while(j >= 1 && b[j].al == b[j-1].al) {
                    j--;
                }
                if(j < id) { id = j; cc = 2; }
                break;
            }
        }
        for(int j = 0; j < n; ++j) {
            if(c[j].id == dd) {
//                while(j >= 1 && a[j].au*a[j-1].p == a[j].p*a[j-1].au) {
//                    j--;
//                }
                while(j >= 1 && c[j].d1 == c[j-1].d1) j--;
                if(j < id) { id = j; cc = 3; }
                break;
            }
        }
        for(int j = 0; j < n; ++j) {
            if(d[j].id == dd) {
//                while(j >= 1 && a[j].al*a[j-1].p == a[j].p*a[j-1].al) {
//                    j--;
//                }
                while(j >= 1 && d[j].d2 == d[j-1].d2) j--;
                if(j < id) { id = j; cc = 4; }
                break;
            }
            
        }
        printf("%d:%d", id+1, cc);
    }

    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值