算法库里面的一些重要函数的总结

1.lower_bound与upper_bound的应用

<1>lower_bound

(1).

.

上述代码返回在升序排序的序列a中第一个大于等于 t 的元素的地址.

算法库里面的一些重要函数的总结_第1张图片

示例:

算法库里面的一些重要函数的总结_第2张图片

(2)

上述代码返回在升序排序的序列a中第一个大于等于 t 的元素的下标.

算法库里面的一些重要函数的总结_第3张图片

示例:

算法库里面的一些重要函数的总结_第4张图片

例题:

P2249 【深基13.例1】查找

P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

输入 n 个不超过 1e9 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1​,a2​,…,an​,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1 。

输入格式

第一行 2 个整数 n 和 m,表示数字个数和询问次数。

第二行 n 个整数,表示这些待查询的数字。

第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。

输出格式

输出一行,m 个整数,以空格隔开,表示答案。

输入输出样例

输入

11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6

输出

1 2 -1 

说明/提示

数据保证,1≤n≤1e6,0≤ai​,q≤1e9,1≤m≤1e5

AC Code:

算法库里面的一些重要函数的总结_第5张图片

<2>upper_bound

(1)

算法库里面的一些重要函数的总结_第6张图片

 上述代码返回在升序排序的序列a中第一个大于 t 的元素的地址.

算法库里面的一些重要函数的总结_第7张图片

示例:

算法库里面的一些重要函数的总结_第8张图片

(2)

 

上述代码返回在升序排序的序列a中第一个大于 t 的元素的下标.

例题:

最大的数II

题目描述

今天,羊村要举行一次“知识竞赛”,很多羊都去参加了,村长见羊太多,决定先举行预选,选出一些人,再参加比赛,给出一个正整数M,求S=1+2+3+…+N的值中,符合条件S<=M的最大的N的值。如给出M的值为7,则N为3,因为1+2+3=6,1+2+3+4=10,所以符合S<=M的条件下,N的最大值为3。对于给定的M的值,喜羊羊很快就说出了符合条件的N的值。现在请你编写一个解决这个问题的程序。

输入

只有一个数,就是M的值。(M<=1000000000)

输出

只有一个数,就是符合题目条件的N的最大值。

样例输入

7

样例输出

3

思路:

开辟数组a表示数列每一项的值,sum数组表示前n项的和,s=(n+1)*n/2>n*n/2;所以N<=1e5.

AC Code:

算法库里面的一些重要函数的总结_第9张图片

P1102 A-B 数对

P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:

A-B=C  => A=B+C ,那么我们可以对于每一个确定的B,查找符合条件的A的个数

参考代码:

算法库里面的一些重要函数的总结_第10张图片

2.reverse的应用(翻转)

翻转Vector:

    std::vector nums(10);
    for (int i = 0; i < 10; i++)
        std::cin >> nums[i];
    std::reverse(nums.begin(), nums.end());
    for (int i = 0; i < 10; i++)
        std::cout << nums[i] << ' ';

翻转数组: 

    int nums[10];
    for (int i = 0; i < 10; i++)
        std::cin >> nums[i];
    std::reverse(nums, nums + 10);
    for (int i = 0; i < 10; i++)
        std::cout << nums[i] << ' ';

翻转字符串:

    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::string s;
    std::cin >> s;
    std::reverse(s.begin(), s.end());
    std::cout << s;

3.去重函数unique

这里的去重不是删除重复元素,而是把多余的元素堆在后面.要先排序再去重才可以实现.

    std::vector vec(10);
    for (int i = 0; i < 10; i++)
        std::cin >> vec[i];
    std::sort(vec.begin(), vec.end());
    int m = std::unique(vec.begin(), vec.end()) - vec.begin();
    std::cout << m << '\n';

    int a[10];
    for (int i = 0; i < 10; i++)
        std::cin >> a[i];
    std::sort(a, a + 10);
    int n = std::unique(a, a + 10) - a;
    std::cout << n << '\n';

 m 和 n 记录的是去重后的元素个数.

4.random_shuffle函数:随机打乱

    std::vector vec(10);
    for (int i = 0; i < 10; i++)
        std::cin >> vec[i];
    std::random_shuffle(vec.begin(), vec.end());
    for (int i = 0; i < 10; i++)
        std::cout << vec[i] << ' ';
    int vec[10];
    for (int i = 0; i < 10; i++)
        std::cin >> vec[i];
    std::random_shuffle(vec, vec + 10);
    for (int i = 0; i < 10; i++)
        std::cout << vec[i] << ' ';

你可能感兴趣的:(算法)