竞赛中常用的库函数

本文详细介绍了竞赛编程中常用的库函数,包括大小写转换函数、二分查找、排序算法(如快速排序和自定义比较)、全排列函数、最值查找方法(minmax,min_element,max_element,nth_element)以及内存操作函数如memset、swap和reverse。
摘要由CSDN通过智能技术生成

竞赛中常用的库函数

1. 大小写转换

1.1 islower/isupper(判断一个字符(char类型)是否为大写或小写)

1.2 tolower/toupper(将字符的大小写形式转换)

1.3 ASCII码

操作:

小写转大写:'c' - 'a' + 'A' = 'C'
大写转小写:'C' - 'A' + 'a' = 'c'
数字(字符)转数字:'6' - '0' = 6

2. 二分查找

2.1 二分查找的前提(序列有序)

2.2 binary_search函数

函数返回一个bool值,true表示要查找的元素在序列中,false表示要查找的元素不在序列中

如果需要找到元素的位置,那么就可以用lower_boundupper_bound函数

示例:

#include <bits/stdc++.h>
int main(void){
	vector<int> numbers = {1, 2, 3, 4, 5};
    int target = 5;
    bool found = binary_search(numbers.begin(), numbers.end(), target);//found = true
    //参数意义:起始地址, 结束地址, 目标
}

2.3 lower_boundupper_bound(重点)

前提:数组必须是非降序的(也就是说后一个元素必须大于等于前一个元素)

可用于找到一个元素所在的左闭右开区间(大于和大于等于的区别)

其中:

lower_bound返回指定区间内第一个大于等于指定元素的地址

upper_bound返回指定区间内第一个大于指定元素的地址

示例:

vector<int> v = {3, 2, 5, 5,6, 8};
sort(v.begin(), v.end());//2, 3, 5, 5, 6, 8

cout << upper_bound(v.begin(), v.end(), 5) - v.begin() << '\n';//返回第一个大于5的下标-->4
cout << lower_bound(v.begin(), v.end(), 5) - v.begin() << '\n';//返回第一个大于等于5的下标-->2
//上述用法说明了upper_bound和lower_bound函数常用来返回指定元素所在的左闭右开区间的下标

3. 排序(sort)

3.1 sort的速度

sort使用的是类快速排序的实现方法,时间复杂度非常优秀,为O(n logn)

3.2 用法

sort函数有三个地址:
sort(起始地址, 结束地址的下一位(, 比较函数))

示例:

int a[1000];
sort(a, a + 1000);//此时默认最后一个参数为“<”,也就是说最终排序出来的是升序序列

3.3 自定义比较函数

假如现在想排列出一个降序序列,可以自定义一个返回值为bool类型的函数

示例:

#include <bits/stdc++.h>
using namespace std;
bool cmp(const int &u, const int &v){
	return u > v;
}
int main(void){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    vector<int> v = {5, 1, 3, 9, 11};
    sort(v.begin(), v.end(), cmp);
    for(auto i : v){
		cout << i << ' ' << '\n';
    }
}

结构体可以将小于号重载后再进行比较:

struct Node{
	int u, v;
    bool operator < (const Node &m)const{
		return u == m.u ? v < m.v : u < m.u;
    }
}

4. 例题–排序

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 1;
int a[N];
int main()
{
  int n; cin >> n;
  for(int i = 1; i <= n; i++){
    cin >> a[i];    
  }
  sort(a + 1, a + n + 1);
  for(int i = 1; i <= n; i++) cout << a[i] << " \n"[i == n];
  for(int i = n; i >= 1; i--) cout << a[i] << " \n"[i == 1];
  return 0;
}

几点经验:

  1. 开大数组最好以全局变量的形式声明
  2. cout << a[i] << " \n"[i == n];—>活用字符串下标的机制,达成最后一个字符后打出回车,其余都是空格的效果

5. 全排列

5.1 next_permutation(返回当前序列的下一个排列)

此函数将序列按照字典序重新排列

若当前序列存在下一个排列,则将当前序列修改为下一个排列,并返回true

若当前序列不存在下一个排列(即当前序列已经是最后一个排列),则将序列修改为第一个序列,并返回false

示例:

#include <bits/stdc++.h>
using namespace std;
int main(void){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    vector<int> nums = {1, 2, 3};
    cout << "Initial permutation: ";
    for(auto num : nums){
		cout << num << ' ';
    }
    cout << '\n';
    
    while(next_permutaion(nums.begin(), nums.end())){
        cout << "Next permutation";
        for(auto num : nums){
			cout << num << ' ';
        }
        cout << '\n';
    }
    return 0;
}

5.2 prev_permutation(返回当前序列的上一个排列)

与next_permutation顺序相反

6. 最值查找

6.1 min max

可传入两个值或者一个列表

min(3, 5);
min({1, 2, 3, 4, 5});

6.2 min_element/ max_element

min_element(st, ed)返回地址[st, ed)中最小的那个值的地址(迭代器),传入参数为两个地址或者迭代器

max_element同理

min_element(v.begin(), v.end());

6.3 nth_element

nth_element(st, k, ed)

进行部分排序,没有返回值

效果:第K个元素的前面的元素都要比这个元素小,后面的元素都要比这个元素大(除了第k个元素,其余元素的位置可能是任意的)

示例:

vector<int> v = {5, 1, 7, 3, 10, 18 ,9};
nth_element(v.begin(), v.begin() + 3, v.end());

7. 其他常用库函数

7.1 memset()

常用来初始化数组

int a[5];
memset(a, 0, sizeof(a));
//三个参数的意义为:指向想要修改的内存的指针,想要修改的值,修改多大的空间

需要注意的是,memset对于非字符类型的数组会存在未定义行为(除了字符其余数据类型都至少为2个字节)

比如int:

//还是上面的例子
int a[5];
memset(a, 1, sizeof(a));
//此处memset实际上把数组的五个元素都设置为了 00000001 00000001 00000001 00000001(int占4个字节)

7.2 swap()

接受两个值的引用,并将它们交换

7.3 reverse()

用于反转容器中的元素顺序

传入起始地址(迭代器)和结束地址(迭代器)(左闭右开)

7.4 unique()

用于去除容器中相邻重复元素的函数

传入起始地址(迭代器)和结束地址(迭代器)(左闭右开)

如果需要去除所有重复的元素,那么需要先对容器进行排序

返回值为第一个重复元素的地址

//注意:调用unique()函数后,重复的元素只是被放在了后面,并没有被删除
vector<int> v = {1, 1, 2, 2, 3};
auto it = unique(v.begin(), v.end());//此时v中元素为1, 2, 3, 1, 2
//此处it的值为指向末尾1的指针
v.erase(it, v.end());//利用unique的返回值,将重复的元素去除
  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ACM C常用库函数是指用于算法竞赛常见算法实现的C语言标准库函数。这些函数可以帮助竞赛选手减少重复造轮子的时间,提高代码的效率和可读性。以下是一些常见的ACM C常用库函数: 1. qsort()函数:快速排序函数,用于对数组进行排序。 2. bsearch()函数:二分查找函数,用于在有序数组查找元素。 3. memset()函数:用于对变量的内存空间进行赋值。 4. memcpy()函数:用于将一个内存的数组复制到另一个内存空间。 5. sprintf()函数:用于将格式化的输出写入一个字符串。 6. fscanf()和fprintf()函数:用于文件的输入输出。 7. stdio.h的printf()和scanf()函数:C语言常用的标准输入输出函数。 8. math.h的数学函数:如sin,cos,tan,exp,log等。 以上这些函数都是ACM C常用库函数非常重要的一部分,掌握好它们对算法竞赛有很大的帮助。由于算法竞赛时间十分紧张,所以熟悉这些函数可以帮助选手快速完成算法实现,提高算法竞赛的效率和成功率。 ### 回答2: ACM (Association for Computing Machinery) C语言常用库函数是指在解决ACM竞赛各种算法问题时,常常使用的C语言函数库。以下是一些常用库函数: 1. 数学函数库(math.h):可以进行数学计算,包括求平方根、三角函数、对数函数、指数函数等。例如,fabs()用于求绝对值,sqrt()用于求平方根,sin()用于求正弦值等。 2. 字符串函数库(string.h):可以操作字符串,包括拷贝、比较、查找等操作。例如,strcpy()用于字符串拷贝,strcmp()用于字符串比较,strcat()用于字符串拼接等。 3. 标准输入输出函数库(stdio.h):可以进行文件操作、标准输入输出等操作。例如,printf()用于输出格式化字符串,scanf()用于标准输入等。 4. 内存操作函数库(stdlib.h):可以进行动态内存分配、随机数生成等操作。例如,malloc()用于动态内存分配,free()用于释放分配的内存,rand()用于随机数生成等。 5. 时间与日期函数库(time.h):可以获取系统时间,处理时间与日期等操作。例如,time()用于获取系统时间,ctime()用于将时间转换成字符串等。 以上是ACM C语言常用库函数的一部分,ACM竞赛常常使用这些函数库来辅助解决各种算法问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值