sort()函数的用法
sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填));
使用形式一:默认从小到大(升序)排序
sort(首元素地址,尾元素地址的下一个地址)
用法案例:登录—专业IT笔试面试备考平台_牛客网
题目
图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数。
每位借书的读者手中有一个需求码,这个需求码也是一个正整数。如果一本书的图书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。
小 D 刚刚当上图书馆的管理员,她知道图书馆里所有书的图书编码,她请你帮她写一个程序,对于每一位读者,求出他所需要的书中图书编码最小的那本书,如果没有他需要的书,请输出-1。
1.按照输入要求进行输入,利用for循环依次输入图书编号,之后再对图书编号进行排序(从小到大),这样一会查找有无用户要的图书时能直接输出最先查找到的图书编号(题中说的是输出需要的书中编号最小的)。
2.利用for循环输入用户的idx以及长度,并进行查找需要的书中最小图书编号 实现查找函数。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int M=2e5+10,N=1e3+10;
int n,q,idx,length;
int book_id[M];
void check(int length,int idx)
{
int t=pow(10,length);
for(int i=0;i<n;i++)
{
//book_id[i]%t 得到 每一个图书编号的后length位 分别与用户编号比较
if(book_id[i]%t==idx)
{
cout<<book_id[i]<<endl;
return ;
}
}
cout<<-1<<endl;
return ;
}
signed main()
{
cin>>n>>q;
for(int i=0;i<n;i++)
{
cin>>book_id[i];
}
sort(book_id,book_id+n);
//从小到大对图书id依次排序
for(int j=0;j<q;j++)
{
cin>>length>>idx;
check(length,idx);
}
return 0;
}
使用形式二:从大到小排序(降序)
sort(首元素地址,尾元素地址的下一个地址,比较函数)
比较函数自定义的参数类型要与要排序的元素的类型保持一致
用法案例:【深基7.例9】最厉害的学生 - 洛谷
题目
现有 N 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 88 个字符的仅有英文小写字母的字符串)、语文、数学、英语成绩(均为不超过 150150 的自然数)。
总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。如果有多个总分相同的学生,输出靠前的那位。
1.先定义一个结构体类型Stu,之后再定义一个结构体Stu类型的变量s[M]数组,输入多个学生信息。
2.对所有学生信息按照总分从高到低进行排序,如果总分相等,则输入序号小的排在前边,使用到了自定义得cmp()函数进行排序
3.排序过后,第一个位置的元素即为最厉害的学生信息,对其进行输出
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int M=2e5+10;
int N;
//创建一个结构体类型Stu
struct Stu
{
string name;
int chinese,math,english;
int sum;
int id;
};
//创建一个含有Stu类型元素的数组变量是s[M]
Stu s[M];
bool cmp(Stu a,Stu b)
{
if(a.sum!=b.sum)
{
return a.sum>b.sum;
//结果为true 则不用交换两个元素的位置
//结果为false 则交换两个元素的位置 保证总分大的在前
}
else
{
//结果为true 则不用交换两个元素的位置
//结果为false 则交换两个元素的位置 保证输入序号小的在前
return a.id<b.id;
}
}
signed main()
{
cin>>N;
for(int i=0;i<N;i++)
{
string name;
int x,y,z;
cin>>name>>x>>y>>z;
s[i]={name,x,y,z,x+y+z,i};
}
//从大到小排序,用到 比较函数
sort(s,s+N,cmp);
//排序过后 此时第一个元素就是最厉害的学生
cout<<s[0].name<<' '<<s[0].chinese<<' '
<<s[0].math<<' '<<s[0].english<<endl;
return 0;
}
对于此题,还有另一种思路,可以不用排序算法,但程序运行时间没上边的快,不过也是一种思路
1.先定义一个结构体类型Stu,之后再定义一个结构体Stu类型的变量s[M]数组,输入多个学生信息。
2.定义一个下标变量best,先假定第一个位置上的学生是最厉害的学生,之后分别与此位置后的每个元素总分进行比较,若存在下标为i的元素总分s[i].sum()>s[best].sum()。
这里也要说一下 结构体变量内也可以定义函数,这里我就定义了一个求总分的函数sum()在结构体内部。
3.下标为best的元素即为最厉害的学生信息,对其进行输出。
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int M=2e5+10;
int N;
struct Stu
{
string name;
int chinese,math,english;
int sum()
{
return chinese + math + english;
}
};
Stu s[M];
signed main()
{
cin>>N;
for(int i=0;i<N;i++)
{
string name;
int x,y,z;
cin>>name>>x>>y>>z;
s[i]={name,x,y,z};
}
int best=0;
for(int i=1;i<N;i++)
{
if(s[i].sum()>s[best].sum())
{
best=i;
}
}
cout<<s[best].name<<' '<<s[best].chinese<<' '
<<s[best].math<<' '<<s[best].english<<endl;
return 0;
}