P5740 【深基7.例9】最厉害的学生

一、编码前的准备

1、读题目

题目描述

现有 N 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 8 个字符的仅有英文小写字母的字符串)、语文、数学、英语成绩(均为不超过 150 的自然数)。总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。如果有多个总分相同的学生,输出靠前的那位。

输入格式

第一行输入一个正整数 N,表示学生个数。

第二行开始,往下 N 行,对于每一行首先先输入一个字符串表示学生姓名,再输入三个自然数表示语文、数学、英语的成绩。均用空格相隔。

输出格式

输出最厉害的学生。

2、分析题目

1、问:何为最厉害的学生?

1、答:总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。

2、问:如果总分相同,该怎么排?

2、答:如果有多个总分相同的学生,输出靠前的那位,也就是说,总分相同,谁先输入,输入谁

3、输出样例&输入样例

输入输出样例

输入 #1

3
senpai 114 51 4
lxl 114 10 23
fafa 51 42 60

输出 #1

senpai 114 51 4

4、数据范围

数据保证,1≤N≤1000,姓名为长度不超过 8 的字符串,语文、数学、英语成绩均为不超过 150 的自然数。

5、数据准备

1、结构体students

1.1、srting name;——>储存名字

1.2、int c,m,e;——>保存分数

1.3、int sum;——>保存总分

1.4、int ID;——>保存序号

2、int n;

3、students a[1010];

二、编程

1、基础框架

#include<bits/stdc++.h>
using namespace std;
struct students{
    string name;
    int c,m,e;
    int sum;
    int ID;
};
students a[1010]
int main(){
    int n;
    cin>>n;
    
    return 0;
}

#include<bits/stdc++.h>      C++的特殊头文件,包含数学库,字符串等常用的函数与方法

2、输入

我们要把他们一个一个的输入近数组a中,那么要用for循环

for(int i=0;i<n;i++){
    cin>>a[i].name>>a[i].c>>a[i].m>>a[i].e;
    a[i].sum=a[i].c+a[i].m+a[i].e;
    a[i].ID=i;
}

我们通过循环输入学生的名字,语数英成绩,并且直接算出sum与ID,方便了后续排序

3、排序

我这里使用排序函数sort,并加上二级排序函数cmp进行对学生排序

bool cmp(students x,students y){
    if(x.sum != y.sum)return x.sum>y.sum;
    return x.ID<y.ID;
}
......
sort(a,a+n,cmp);

问:为什么排ID时要用小于?

答:因为越靠前越小,所以要用小于,因为在输入ID时是之间用的循环变量i,所以I越小,输入的越靠前。

4、输出

out<<a[0].name<<" "<<a[0].Chiese<<" "<<a[0].Math<<" "<<a[0].Englishi;

输出最前面的,就是索引0

5、完全代码

#include<bits/stdc++.h>
using namespace std;

struct students{
	string name;
	int c,m,e;
	int sum=0;
    int ID;
};
bool cmp1(students x,students y){
	if(x.sum != y.sum)return x.sum>y.sum;
    return x.ID<y.ID;
}

students a[1010];


int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i].name >> a[i].c >>a[i].m >>a[i].e;
        a[i].sum = a[i].c + a[i].m + a[i].e;
        a[i].ID=i;
	}
	sort(a,a+n,cmp1);
	cout<<a[0].name<<" "<<a[0].c<<" "<<a[0].m<<" "<<a[0].e;
	return 0;
}

6、检测

三、总结

本题我们运用了结构体的知识,定义了一个学生的信息,并进行排序,在二级排序中,有一个易错点,也就是ID的排序,所以要认真思考,不要出现逻辑错误哦。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值