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;
}



结构体数组排序通常指的是对包含多个字段的自定义数据类型(结构体)构成的数组按照某个特定字段进行有序排列。在大多数编程语言中,例如C、C++或C#,可以采用以下步骤来进行排序: 1. 定义结构体:首先,你需要定义一个结构体,它包含你想要排序的各个属性,比如整型、浮点型或其他变量。 ```c++ struct Student { int id; char name[50]; float score; }; ``` 2. 创建数组:创建一个该结构体类型的数组,并填充一些元素。 ```c++ Student students[5] = { {1, "Alice", 85}, {2, "Bob", 90}, {3, "Charlie", 78}, // ... }; ``` 3. 选择排序方式:你可以选择冒泡排序快速排序、插入排序等标准排序算法,针对结构体数组的地址进行比较,实际上是对内部的score或者其他排序依据字段进行比较。 4. 指针操作:因为是结构体,所以在函数内部需要通过指针来访问结构体内的成员。例如,使用`->`运算符在C++中访问。 5. 实现排序函数:编写一个函数,接受结构体数组作为参数,然后通过遍历数组并交换元素位置来完成排序。 ```cpp void sortStudents(Student* arr, int size) { for (int i = 0; i < size - 1; i++) { // 使用一个临时变量,将当前元素与下一个元素比较并交换 if (arr[i].score > arr[i + 1].score) { Student temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } ``` 6. 调用排序函数:最后,在主程序中调用这个函数,传入结构体数组和其大小。 ```c++ sortStudents(students, sizeof(students) / sizeof(students[0])); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值