C39-11.9 结构体排序(2)
原题链接:38471.note12025-11-09 18:20:03
发布于:江苏
1. 上节课作业
#include <bits/stdc++.h>
using namespace std;
struct node{
int id;
double score;
};
node a[1005];
int n, k;
bool cmp(node x, node y){
return x.score > y.score;
}
int main() {
cin >> n >> k;
for (int i=1; i<=n; i++){
cin >> a[i].id >> a[i].score;
}
//参数1:开始排序地址
//参数2: 结束排序地址
//参数3: 自定义的比较规则
sort (a+1, a+1+n, cmp);
cout << a[k].id << ' ' << a[k].score << endl;
return 0;
}
/*
在一次考试中,每个学生的成绩都不相同,
现知道了每个学生的学号和成绩,
求考第 k 名学生的学号和成绩。
【题意分析】
输入 n 个学生的信息,按照分数大小,输出第 k 名学生的信息。
【思路分析】
每个学生有两个属性,分别为学号和成绩,声明结构体类型,
包含以上两个属性,定义结构体数组,按照学生成绩从大到小进行排序。
对于排完序后的结构体数组,输出下标为 k 的学生的信息(学号+成绩)即可。
1、定义变量
2、输入
3、按照分数进行排序
4、输出
样例组
输入#1
5 3
90788001 67.8
90788002 90.3
90788003 61
90788004 68.4
90788005 73.9
输出#1
90788004 68.4
*/
2. 上节课作业
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N], n;
bool cmp(int x, int y){
if (x%10 != y%10)
return x%10 > y%10;
return x < y;
}
int main() {
cin >> n;
for (int i=1; i<=n; i++){
cin >> a[i];
}
sort (a+1, a+1+n, cmp);
for (int i=1; i<=n; i++){
cout << a[i] << '\n';
}
return 0;
}
/*
[【结构体的应用】个位排序]
题目描述
小码君给了你 n 个整数,
你需要将这些数字按照个位数的大小从大到小进行排序,
如果个位数一样则按照数字从小到大的顺序排序。
输入格式
第一行一个整数 n(1≤n≤1e5),
表示整数的个数。接下来一行 n 个整数,
每个整数都在 int 范围内。
输出格式
输出 n 行,每行一个整数。
样例组
输入#1
3
1
22
31
输出#1
22
1
31
输入输出样例:
3 个数分别为 1、22、31,先按照个位从大到小排序,
所以 22 排在第一。
1 和 31 的个位一样,按照本身从小到大排序,
所以 1 排在 31 的前面。
3 个数排完序之后为 22、1、31
*/
3. 记录生日
#include <bits/stdc++.h>
using namespace std;
struct node{
string name;
int y, m, d;
int order; //登记顺序
}a[1005];
int n;
bool cmp(node x, node z){
if (x.y != z.y){
return x.y < z.y; //年份
}
else if (x.m != z.m){
return x.m < z.m; //月份
}
else if (x.d != z.d){
return x.d < z.d; //日期
}
else return x.order > z.order; //序号
}
int main() {
cin >> n;
//输入n个生日
for(int i=1; i<=n; i++){
a[i].order = i;
cin>>a[i].name >> a[i].y >> a[i].m >> a[i].d;
}
sort(a+1, a+1+n, cmp);
for(int i=1; i<=n; i++) {
cout << a[i].name << endl;
}
return 0;
}
/*
[AC_U04-03_记录生日]
题目描述
众所周知,小码君是一位社交达人,他的朋友圈极其广泛。
除了朋友遍布世界各地外,小码君朋友的年龄层次也非常丰富多样。
现在小码君想要记录他好朋友们的生日,并按照他们年龄从大到小的顺序排序。
如果其中有两个朋友的生日相同,输入顺序靠后的朋友先输出。
但小码君最近要进行期末考试了,没有时间自己记录,请你编写代码帮他完成排序。
提示
数据范围:
1≤n≤100
1≤姓名长度≤20
1960≤年≤2024
其中,月和日均合法。
输入格式
输入一共有 n+1 行,
第一行为小码君的好朋友总人数 n,
第 2 至 n+1 行为每个人的姓名、出生年、月以及日。
输出格式
输出一共有 n 行,即 n 个生日从大到小的朋友姓名。
样例组
输入#1
4
1 张三 2012 5 15
2 李四 2003 8 22
3 王五 2020 3 10
4 赵六 1995 11 5
输出#1
赵六
李四
张三
王五
输入#2
4
张三 1995 11 5
李四 2003 8 22
王五 2020 3 10
赵六 1995 11 5
输出#2
赵六
张三
李四
王五
*/
5. 第k大的数
#include<bits/stdc++.h>
using namespace std;
struct node{
string num;
int order;
}a[105];
int n, k;
bool cmp(node x, node y){
string c = x.num, b = y.num;
if (c.size() != b.size()){ //长度不一样的,越长越大
return c.size() > b.size();
}else if (c != b){ //长度相同的 直接比较大小
return c> b;
}
else {
return x.order > y.order; //值相同的比较顺序先后
}
}
int main() {
cin >> n >> k;
for (int i=1; i<=n; i++){
cin >> a[i].num;
a[i].order = i;//记录顺序
}
sort(a+1, a+1+n, cmp);
cout << a[k].num;
return 0;
}
/*
[AC_U04-03_第k大数]
题目描述
小码君给了你 n 个整数,这些数字的位数可能达到 1000 位,
你需要告诉小码君这 n 个数中的第 k 大数字。
如果存在多个相等值,默认输入顺序靠后的数字在前。
输入格式
第一行两个整数 n,k (1≤k≤n≤100),表示有 n 个数,需要找出第 k 大数字。
接下来一行 n 个数,每个数字的位数小于等于 1000 位。
输出格式
输出一行,n 个数中的第 k 大数字。
样例组
输入#1
3 1
1 2 3
输出#1
3
输入#2
3 1
102
113
1345
输出#2
1345
*/
6. 成绩排序
#include <bits/stdc++.h>
using namespace std;
struct node{
int c, m, e;
int id;
int sum;
}a[305];
bool cmp(node x, node y){
if(x.sum != y.sum){
return x.sum>y.sum;
}
else if(x.c != y.c){
return x.c>y.c;
}
else {
return x.id < y.id;
}
}
int main() {
int n; cin >> n;
for(int i=1; i<=n; ++i){
cin>>a[i].c>>a[i].m>>a[i].e;
a[i].id = i;
a[i].sum = a[i].c + a[i].m + a[i].e;
}
sort(a+1, a+1+n, cmp);
for (int i=1; i<=5; i++){
cout << a[i].id << ' ' << a[i].sum << endl;
}
return 0;
}
/*
[AC_U04-03_小码奖学金]
题目描述
小码学院最近得到了一笔来自陌生富豪的赞助,
并且期末考试刚好结束了,
所以校长打算拿出其中的一部分分发给学习成绩优秀的前 5 名学生作为奖学金。
每个学生都有三门课的成绩:语文、数学、英语,为了保证学生成绩排名是唯一的,校长拟定了以下排名规则:
1. 所有学生先按照总分的从高到低排序。
2. 若两名同学的总分相同,则按照语文成绩的从高到低排序。
3. 如果两名同学的总分和语文成绩都相同,则按照学号的从小到大排序。
请你帮校长算一算哪些同学可以获得奖学金,并告诉校长这些同学对应的总分。
提示
数据范围:
1≤n≤300
1≤成绩≤300
输入格式
输入一共有 n+1 行。
第一行输入一个整数,表示学生总人数 n。
第 2 至 n+1 行每行三个整数,
第 i+1 行表示学号为 i 的学生语文、数学、英语成绩。
输出格式
输出一共有 5 行,第 i 行输出第 i 名学生的学号和总分。
样例组
输入#1
5
80 85 90
85 80 90
90 80 85
85 90 80
80 90 85
输出#1
3 255
2 255
4 255
1 255
5 255
*/
这里空空如也








有帮助,赞一个