sort函数介绍
sort是STL中的排序算法,用sort()
方法就可以只需要一条语句就可以实现排序,这样就极大的节省了我们在刷题中所花费的时间。 它使用的是一种类似快速排序
,他在最坏情况下的时间复杂度是(Nlog n)
-
定义:
-
#include<algorithm> //要导入算法库
-
void sort(RandomAccessLterator flist ,RandomAccessLterator last [,Compare comp])
-
-
属性
-
无返回值
-
排序范围:[first,last),包括起始,不包括尾值
-
默认排升序
-
逆序排序加上辅助函数
bool cmp(int e1,int e2){//原理为真时,第一个元素放前面 //参数值根据要排序的元素类型改编 return e1>e2; } void solve(){ int a[10] = {1,2,3,4,5,6,7,8,9,10}; sort(a,a+10,cmp); for(int i = 0;i<10;i++){ cout<<a[i]<<" "; } }
-
-
实例
[BAN-PICK]([B3680 语言月赛202211] BAN-PICK - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) )
在第五人格职业联赛的每一场对局中,需要进行 Ban-Pick 流程。Ban 即角色禁用,Pick 即角色选用。
如试题 Winner 所述,游戏分为 求生者(SurvivorSurvivor) 与 监管者(HunterHunter) 两个阵营。求生者阵营 共有 𝑛n 名角色,监管者阵营 共有 𝑚m 名角色。
在某局比赛中,监管者 可以 ban(禁用) 掉 求生者阵营 55 名角色,求生者 可以 ban(禁用) 掉 监管者阵营 22 名角色。
每个角色,无论其属于求生者阵营还是监管者阵营,均可以使用 熟练度 来量化该阵营选手选择该角色的优先程度。选手一定会优先选择 熟练度 更高的角色进行游戏。
基于这样的考量,监管者选手 在进行 Ban 流程时,往往会选择 ban(禁用) 掉 求生者阵营熟练度最高 的若干名 求生者角色。同样,求生者选手 在进行 Ban 流程时,往往会选择 ban(禁用) 掉 监管者阵营熟练度最高 的若干名 监管者角色。
在 Ban 流程完成后,需要执行 Pick 流程。
如试题 Winner 所述,求生者选手 需要从 求生者阵营 中选择 44 名不同的角色,监管者选手 需要从 监管者阵营 中选择 11 名角色。
现在告诉你所有角色的名字、阵营与选手对其熟练度,请你给出双方阵营 Pick 的角色名字。
输入格式
输入共 𝑛+𝑚+1n+m+1 行。
输入的第一行为两个整数 𝑛,𝑚n,m,分别代表求生者阵营角色数和监管者阵营角色数。
接下来 𝑛+𝑚n+m 行,首先为一个仅由英文字母组成的字符串,代表该角色的姓名;接下来为一个大写字符 H
或 S
,若为 H
,则代表该角色为监管者阵营,若为 S
,则代表该角色为求生者阵营;接下来一个正整数,代表该阵营选手对该角色的熟练度。上述字符串、大写字符、正整数之间由一个空格分隔。
输出格式
输出共 55 行。
输出的第一行为监管者阵营选择角色的角色名。
输出的第二到五行为求生者阵营选择角色的角色名,按照熟练度从高到低排列。
-
题解
- 用sort函数对结构体数组进行了排序
#include<bits/stdc++.h> using namespace std; const int N = 100000 + 10; #define int long long struct Node { string name; int s; }s1[N],s2[N]; bool cmp(Node e1, Node e2) { return e1.s > e2.s; } int n, m, num1 = 0, num2 = 0; signed main() { cin >> n >> m; for (int i = 0; i < n + m; i++) { string name; char h; int s; cin >> name >> h >> s; if (h == 'H') { s1[num1].name = name; s1[num1].s = s; num1++; } if (h == 'S') { s2[num2].name = name; s2[num2].s = s; num2++; } } sort(s1 + 0, s1 + m,cmp); sort(s2 + 0, s2 + n,cmp); cout << s1[2].name << endl << s2[5].name << endl << s2[6].name << endl << s2[7].name << endl << s2[8].name; return 0; }
[高考题组]([B3827 NICA #2] 高考组题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) )
高考是能决定每个考生命运的考试,因此作为组卷人的 Aya 将高考组卷视为重中之重。现在 Aya 有 𝑛n 个备选的高考题。
对于每一道可能选入试卷的高考题,其有 𝑘k 个指标来评判它各个方面的维度,例如难度、新颖度、与现实生活的结合性等。每个指标均为一个正整数。
Aya 认为,一个题被放入高考卷的必要性,是这些指标的平均值。他认为,必要性前二高的试题必须要被放进高考试卷。若有多个必要性前二大的试题则选择较早出现的那个。请告诉 Aya 哪个题目是必须要放进高考试卷的。
输入格式
第一行输入两个正整数 𝑛,𝑘n,k,含义如题所述;
第二行开始,往下 𝑛n 行,每行输入 𝑘k 个正整数,以空格隔开,第 𝑖i 行表示第 𝑖−1i−1 道题的各个指标是多少。
输出格式
输出两行,表示必要性前两大的试题是哪两个题。优先输出必要性最高的;若有多个题目必要性相同,则优先输出较早出现的。
#include <bits/stdc++.h>
using namespace std;
struct node {
int sum, rk;
double ave;
}a[110];
bool cmp(node a, node b) {
if (a.ave != b.ave)return a.ave > b.ave;//平均值不等时,逆排
return a.rk < b.rk;//平均值顺排
}
int main() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
int x;
cin >> x;
a[i].rk = i;
a[i].sum += x;
}
a[i].ave = 1.0 * a[i].sum / k;
}
sort(a + 1, a + n + 1, cmp);
cout << a[1].rk << '\n' << a[2].rk;
return 0;
}