sort()函数介绍

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 行,首先为一个仅由英文字母组成的字符串,代表该角色的姓名;接下来为一个大写字符 HS,若为 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值