《算法竞赛进阶指南》学习总结 #include<algorithm>

今天下午大致学完了进阶指南中algorithm头文件下的内容,在这里进行一个总结。

  reverse翻转

  顾名思义,reverse进行的操作就是翻转原来的顺序,理解非常简单,故不赘述。

操作样例:

#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int b[233];
int main()
{
    int na,nb;  //vector的实现
    scanf("%d",&na);
    for(int i=0;i<na;i++)
    {
        int x;
        scanf("%d",&x);
        a.push_back(x);
    }
    reverse(a.begin(),a.end());
    for(int i=0;i<na;i++)
    printf("%d ",a[i]);
    cout<<endl;  //数组下的实现
    scanf("%d",&nb);
    for(int i=1;i<=nb;i++)
    scanf("%d",&b[i]);
    reverse(b+1,b+1+nb);
    for(int i=1;i<=nb;i++)
    printf("%d ",b[i]);
    return 0;
}

unique去重


unique的含义仍然很好理解ovo,我也不说太多了,函数返回值可以是去重后的元素个数,比如:

int m=unique(a.begin(),a.end())-a.begin();

int n=unique(b+1,b+1+len)-b-1;

操作样例:

#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int b[233];
int na,nb;
int main( )
{
    scanf("%d",&na);
    for(int i=0;i<na;i++)
    {
        int x;
        scanf("%d",&x);
        a.push_back(x);
    }
    int ma=unique(a.begin(),a.end())-a.begin();
    for(int i=0;i<ma;i++)
    printf("%d ",a[i]);
    cout<<endl;
    scanf("%d",&nb);
    for(int i=1;i<=nb;i++)
    scanf("%d",&b[i]);
    int mb=unique(b+1,b+1+nb)-b-1;
    for(int i=1;i<=mb;i++)
    printf("%d ",b[i]);
    return 0;
}

random_shuffle随机打乱

用法和reverse相同,我都懒得写代码了...

sort快速排序

想必sort的一般用法大家都很熟悉了,不再赘述,但vector<struct>我以前倒没有接触过。

我看网上有很多博客介绍,但似乎都不太清晰,所以自己摸索出了一种比较麻烦占空间但简单易懂的方法,希望dalao指点。

操作实例:

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int x,y;
};
node b[233];
vector<node>a;
bool operator <(const node &a,const node &b)
{
    return a.x<b.x;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    scanf("%d%d",&b[i].x,&b[i].y);
    a.push_back(b[i]);
    }
    sort(a.begin(),a.end());
    for(int i=0;i<a.size();i++)
    printf("%d %d\n",a[i].x,a[i].y);
    return 0;
}

permutation全排列

组合数学大家一定多多少少都有所了解,全排列指的就是A(n,n)式的所有排列方法,也就是说五选五。

next_permutation()会取得[first,last)所标示之序列的下一个排列组合;

利用next_permutation的返回值,判断是否全排列结束 如果没有下一个排列组合,便返回false;

否则返true; STL提供了两个用来计算排列组合关系的算法; 分别是next_permutation和prev_permutation;

下一个全排列(next_Permutation) 前一个全排列(prev_permutation)

简单来说

next_permutation
按照字典序由小到大的全排列

prev_permutation
按照字典序由大到小的全排列

二者返回值为true/false 用来判断是否还有下一个排列  全排列的输出正常的for循环即可

注:两者为互逆运算

#include<bits/stdc++.h>
using namespace std;
int a[25],b[25];
int main()
{
    int n1,n2;
    cout<<"对next_permutation的操作\n";
    cin>>n1;
    for(int i=1;i<=n1;i++)
    cin>>a[i];//输入数据应该是一组数据全排列中字典序不为最大的一类
    do
    {
        for(int i=1;i<=n1;i++)
        cout<<a[i]<<" ";
        cout<<endl;
    }while(next_permutation(a+1,a+1+n1));
    cout<<endl;
    cout<<"对prev_permutation的操作\n";
    cin>>n2;
    for(int i=1;i<=n2;i++)
    cin>>b[i];//输入数据应该是一组数据全排列中字典序不为最小的一类
    do
    {
        for(int i=1;i<=n2;i++)
        cout<<b[i]<<" ";
        cout<<endl;
    }while(prev_permutation(b+1,b+1+n2));
    return 0;
}

lower_bound与upper_bound

l_b的作用是在一个区间内寻找第一个大于等于x的元素的位置,u_b是查找
第一个大于x的元素的位置,返回值就是其位置。

当然还有其他操作,比如它有一个很重要的作用就是和unique函数配套使用进行离散化,后续我会在STL的总结中具体解释。

#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int b[233];
int na,nb,xa,xb;
int main()
{
    scanf("%d%d",&na,&xa);
    for(int i=0;i<na;i++)
    {
        int x;
        scanf("%d",&x);
        a.push_back(x);
    }
    printf("%d\n",lower_bound(a.begin(),a.end(),xa)-a.begin());
    scanf("%d%d",&nb,&xb);
    for(int i=1;i<=nb;i++)
    {
        scanf("%d",&b[i]);
    }
    printf("%d\n",upper_bound(b+1,b+1+nb,xb)-b);
    return 0;
}

我的总结主要以代码为主,algorithm下的函数都简单易懂,没有用太多的文字说明,都是自己手打测试的操作实例,多测试几组数据,自然就明白了。

如果有不对的地方,希望dalao指正。>w<

原文地址:https://www.cnblogs.com/valentino/p/11141123.html

时间: 2024-11-29 10:29:37

《算法竞赛进阶指南》学习总结 #include<algorithm>的相关文章

《算法竞赛进阶指南》学习总结 二分与三分

首先......我是一个很菜很菜的萌新,所以这篇文章写得很详细,有很多我自己的口水话方便我理解,请各位谨慎食用qwq 以前在网上找过很多介绍二分的博客,但都感觉对萌新不太友好,反正我当时连跳石头都没看懂,所以决定自己写一篇!其中有我的想法,也借鉴了书里的很多内容,感谢lyd. 二分答案,顾名思义,就是对我们所需要的答案进行二分,对我们要求的值进行二分.二分的基础用法是在单调序列或者单调函数当中查找,当答案具有单调性,我们就可以采用二分来计算,当然还有三分,在后面我会详细讲到 整数集合上的二分 在

《算法竞赛进阶指南》0.8总结与练习(1)

116. 飞行员兄弟 "飞行员兄弟"这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱. 已知每个把手可以处于以下两种状态之一:打开或关闭. 只有当所有把手都打开时,冰箱才会打开. 把手可以表示为一个4х4的矩阵,您可以改变任何一个位置[i,j]上把手的状态. 但是,这也会使得第i行和第j列上的所有把手的状态也随着改变. 请你求出打开冰箱所需的切换把手的次数最小值是多少. 输入格式 输入一共包含四行,每行包含四个把手的初始状态. 符号"+"表示把手处于闭合状态,而

【算法竞赛进阶指南】USACO07Tallest Cow

前缀和,利用左右端点操作代替对区间的操作,从而优化输入,最后进行一次前缀和的操作,求得结果,这道题里面有个很关键的问题,就是需要去重,本来我想用set,但貌似有点鬼畜,算了,利用map去重,还有pair类型(学一下) #include <iostream> #include <algorithm> #include <map> #include <utility> using namespace std; map<pair<int,int>

【算法竞赛进阶指南】POJ1845Sumdiv

本题目是一道数论的综合题目,主要的一个点就是利用二分法来求等比数列的和,其余的点就是唯一分解定理分解质因数,还有就是快速幂 A^B约数和\(=(1+p_{1}+p_{1}^{2}+\cdot\cdot\cdot+p_{1}^{c1})*(1+p_{2}+p_{2}^{2}+\cdot\cdot\cdot+p_{2}^{c2})*\cdot\cdot\cdot*(1+p_{n}+p_{n}^{2}+\cdot\cdot\cdot+p_{n}^{cn})\) 如果c是奇数(一共有偶数项)\(sum(

【算法竞赛进阶指南】扩展最大子段和POJ1050ToTheMax

最大子段和 最大子段和可以利用贪心/DP的思想来解决,我这里没有严格证明,但是思考之后觉得很有道理,如果某一段字段和,不包括该数时,前段小于0,能么加上该数不会变的更大,能么当前子段和应该只有当前一个数字,如果大于0,加上该数,更新一下最大子段和(ans),顺便贴一下例题P1115 #include<iostream> #include<algorithm> using namespace std; int main(){ int n; cin>>n; int maxa

《算法竞赛进阶指南》0.4二分

102. 最佳牛围栏 农夫约翰的农场由N块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头. 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大. 围起区域内至少需要包含 F块地,其中 F会在输入中给出. 在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少. 输入格式 第一行输入整数 N和 F,数据间用空格隔开. 接下来 N行,每行输出一个整数,第i+1行输出的整数代表,第i片区域内包含的牛的数目.

《算法竞赛进阶指南》0.6倍增

109. 天才ACM 给定一个整数 M,对于任意一个整数集合 S,定义"校验值"如下: 从集合 S中取出 M 对数(即 2?M 个数,不能重复使用集合中的数,如果 S 中的整数不够 M 对,则取到不能取为止),使得"每对数的差的平方"之和最大,这个最大值就称为集合 S的"校验值". 现在给定一个长度为 N的数列 A 以及一个整数 T. 我们要把 A分成若干段,使得每一段的"校验值"都不超过 T. 求最少需要分成几段. 输入格式

《算法竞赛进阶指南》1.8总结与练习(1)

150. 括号画家 达达是一名漫画家,她有一个奇特的爱好,就是在纸上画括号. 这一天,刚刚起床的达达画了一排括号序列,其中包含小括号( ).中括号[ ]和大括号{ },总长度为N. 这排随意绘制的括号序列显得杂乱无章,于是达达定义了什么样的括号序列是美观的: (1) 空的括号序列是美观的: (2) 若括号序列A是美观的,则括号序列 (A).[A].{A} 也是美观的: (3) 若括号序列A.B都是美观的,则括号序列AB也是美观的. 例如 (){} 是美观的括号序列,而)({)[}]( 则不是.

题解|《算法竞赛进阶指南》 Sticks

题目描述George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Plea