首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >杨校老师课堂之基于C++的结构体排序相结合解题_信息学奥赛-基础练习题

杨校老师课堂之基于C++的结构体排序相结合解题_信息学奥赛-基础练习题

作者头像
杨校
发布2025-02-23 07:55:58
发布2025-02-23 07:55:58
2230
举报

1. 第 K 名 计蒜客 - T1318

问题描述: 刚举行的万米长跑活动中,有 N 个人跑完了全程,所用的时间都不相同。颁奖时为了增加趣味性,随机抽了一个数 K,要奖励第 K 名一双跑鞋。 现在组委会给你 N 个人的姓名、成绩(用时,单位是秒),请你编程快速输出第 K 名的姓名。

输入格式: 第一行:2 个整数 N 和 K。 下面 N 行:每行第 1 个是字符串表示姓名; 第 2 个是个整数,表示这个人跑完的使用时间。

输出格式: 一行,第 K 名的姓名。

数据范围: 1≤K≤N≤100。

样例输入:

代码语言:javascript
复制
5 3
lisi 2306
zhangsan 3013
wangwu 3189
suantoujun 4012
zhaoliu 2601

样例输出:

代码语言:javascript
复制
zhangsan

参考程序

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct T {
    string name;
    int s;
} stu[101];

bool cmp(T a,T b) {
    return a.s < b.s;
}
int main() {
    int n,k; cin>>n>>k;
    for (int i=0; i<n; i++) {
        cin>>stu[i].name>>stu[i].s;
    }
    sort(stu, stu+n, cmp);
    cout<<stu[k-1].name<<endl;
    return 0;
}

2. 谁是第N名

题目描述 考试结束后,同学们的成绩都不一样,知道了学生的考号以及分数,找出谁是第N名。 输入描述 第一行有两个整数,分别是学生的人数m(1≤m≤100),和求第N名学生的(1≤N≤m)。 其后有m行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。 输出描述 输出第N名学生的学号和成绩,中间用空格分隔。 样例 输入

5 3 90788001 67.8 90788002 90.3 90788003 61 90788004 68.4 90788005 73.9

输出

90788004 68.4

代码语言:javascript
复制
 #include <iostream>
#include <algorithm>
using namespace std;

// 定义结构体来存储学生的学号和成绩
struct Student {
    int id;
    double score;
};

// 自定义比较函数,用于按照成绩从高到低排序
bool compare(Student a, Student b) {
    return a.score > b.score;
}

int main() {
    int m, n;
    cin >> m >> n;
    // 定义静态结构体数组来存储学生信息
    Student students[100];
    for (int i = 0; i < m; i++) {
        cin >> students[i].id >> students[i].score;
    }

    // 使用sort函数结合自定义比较函数进行排序
    sort(students, students + m, compare);

    // 输出第N名学生的学号和成绩
    cout << students[n - 1].id << " " << students[n - 1].score << endl;

    return 0;
}

3. 排名

题目描述 一年一度的江苏省小学生程序设计比赛开始了,组委会公布了所有学生的成绩,成绩按分数从高到低排名,成绩相同按年级从低到高排名。现在主办单位想知道每一个排名 的学生前,有几位学生的年级低于他。

输入描述 第一行只有一个正整数n(1<=n<=200),表示参数的学生人数 第2~n+1行,每行有两个正整数s(0<=s<=400)和g(1<=g<=6),之间用一个空格隔开,其中第i+1行的第一个数s表示第i个学生的成绩,第i+1行的第二个数g表示第i个学生的年级

输出描述 输出n行,每行只有一个正整数,其中第i行的数k表示排第i名的学生前面有k个学生排名比他高,且年级比他低

样例 输入

5 300 5 200 6 350 4 400 6 250 5

输出

0 0 1 1 3

参考代码

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
using namespace std;

// 定义结构体来存储学生的成绩和年级信息
struct Student {
    int score;
    int grade;
};

// 自定义比较函数,先按成绩从高到低排序,成绩相同按年级从低到高排序
bool compare(Student a, Student b) {
    if (a.score!= b.score) {
        return a.score > b.score;
    }
    return a.grade < b.grade;
}

int main() {
    int n;
    cin >> n;
    // 定义静态数组来存储学生信息
    Student students[200];
    for (int i = 0; i < n; i++) {
        cin >> students[i].score >> students[i].grade;
    }

    // 使用sort函数按照自定义规则进行排序
    sort(students, students + n, compare);

    for (int i = 0; i < n; i++) {
        int count = 0;
        for (int j = 0; j < i; j++) {
            if (students[j].grade < students[i].grade) {
                count++;
            }
        }
        cout << count << endl;
    }

    return 0;
}

4. 分数线是多少

题目描述 可达鸭如火如荼地进行了编程比赛,通过二轮测试的同学将会得到丰厚的礼品,首先根据一轮测试的结果划定一个分数线,分数线根据最终得奖人数的150%划定,即如果计划最终得奖人数为m名,则分数线为排名第m*150%(向下取整)名的选手的分数。请你划定一下这个编程比赛的分数线,输出可以有机会得到礼品的同学的报名号和成绩。

输入描述 第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加一轮测试的学生总数,m 表示最终得奖人数。输入数据保证m*150%向下取整后小于等于n。 第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是学生的报名号k(1000 ≤ k ≤ 9999)和该学生的一轮测试成绩s(1 ≤ s ≤ 100)。数据保证学生的报名号各不相同.

输出描述 第一行,有两个整数,用一个空格隔开,第一个整数表示进入二轮测试的分数线;第二个整数为进入二轮测试的学生实际人数 从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入二轮测试的学的的报名号和一轮测试成绩,按照成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。 样例 输入

6 3 1000 90 3239 88 2390 95 7231 84 1005 95 1001 88

输出

88 5 1005 95 2390 95 1000 90 1001 88 3239 88

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
using namespace std;

// 定义结构体来存储学生的报名号和成绩信息
struct Student {
    int id;
    int score;
};

// 自定义比较函数,先按成绩从高到低排序,成绩相同按报名号从小到大排序
bool compare(Student a, Student b) {
    if (a.score!= b.score) {
        return a.score > b.score;
    }
    return a.id < b.id;
}

int main() {
    int n, m;
    cin >> n;
    cin >> m;
    // 定义静态数组来存储学生信息
    Student students[5000];
    for (int i = 0; i < n; i++) {
        cin >> students[i].id >> students[i].score;
    }

    // 使用sort函数按照自定义规则进行排序
    sort(students, students + n, compare);

    // 计算分数线对应的索引,向下取整
    int cutIndex = m * 150 / 100;
    int cutScore = students[cutIndex - 1].score;
    int count = 0;
    for (int i = 0; i < n; i++) {
        if (students[i].score >= cutScore) {
            count++;
        }
    }

    // 输出分数线和进入二轮测试的学生实际人数
    cout << cutScore << " " << count << endl;

    // 输出进入二轮测试的学生的报名号和成绩
    for (int i = 0; i < n; i++) {
        if (students[i].score >= cutScore) {
            cout << students[i].id << " " << students[i].score << endl;
        }
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 第 K 名 计蒜客 - T1318
  • 2. 谁是第N名
  • 3. 排名
  • 4. 分数线是多少
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档