qbxt Day 1 morning

——2020.1.17 济南 主讲:李佳实

目录一览

1.模拟和枚举
2.基础搜索算法(DFS、BFS、记忆化搜索)以及进阶搜索算法(纯靠自学)

总知识点:基础算法

一、模拟和枚举

1.算法描述:模拟,顾名思义就是按照题目的要求,它让你做什么,按照要求做。
2.例题一览:
(1)【算法:枚举】寻找三位数
题目描述:
将1, 2, …, 9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1: 2: 3的比例,试求出所有满足条件的三位数。

分析:
首先我们会轻易的想到可以直接暴力枚举这三位,不过这种做法显然会超时。我们不妨转变一下思路,直接枚举这个三位数,可是如果从100到999的话,也显然会超时,而题中还有一个条件“三个”三位数,那我们就可以把1000平均分开,枚举一部分,降低时间复杂度。1000/3约等于333,循环就从100-333循环,而我们根据这一倍的量,计算出2倍、3倍,再判断有没有重复的数字。这道题就完美的解决了。

代码:(C++版)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 1000
#define M 1000
using namespace std;
int time[10];
void get(int x){
    time[x%10]++;
    time[x/10%10]++;
    time[x/100]++;
}
int main(){
    for(int i=100;i<=333;i++){
        int x=i,y=i*2,z=i*3;
        memset(time,0,sizeof(time));
        get(x);
        get(y);
        get(z);
        bool flag=true;
        for(int j=1;j<=9;j++) if(time[j]!=1) flag=false;
        if(flag){
            cout<<x<<' '<<y<<' '<<z<<endl;
        }
    }
    return 0;
}

(2)【算法:模拟】河伯阵型
题目描述:

分析:没什么好说的,按照题要求的做就是了。

代码:

二、搜索

1.深度优先搜索(DFS)
(1)算法描述:对于任意的一个图,有一点x,我们寻找与它连通的所有深度更深的点y(若没有,回到上一个点)。若y被访问过,回到x。反之,访问y。如此循环往复。
(2)特征:若x被访问过,则x的父节点也一定被访问过。每条边至多被访问2次,每个点至多被访问一次。
(3)代码框架:

inline void dfs(int x){
    int i;
    vis[x]=1;
    for(i=1;i<=n;i++){
        if(mp[x][i]&&!vis[i]){
            dfs(i);
        }
    }
}

(4)使用DFS枚举已知集合的所有子集状态
分析:对于一个元素a[i],我们有两种选择:选or不选。于是我们DFS求出来的树同时是一棵二叉树。先沿着选的方向到底,在一步步回溯,直到遍历结束。
代码:

inline void dfs(int x){
    if(x>n){
        //得到了一个子集
        return ;
    }
    s[++tot]=a[x];
    dfs(x+1);
    tot--;
    dfs(x+1);
}

(5)DFS枚举1~n的全排列
分析:见代码
代码:

inline void dfs(int x){
    if(x>n){
        //得到了一个排列
        return ;
    }
    int i;
    for(i=1;i<=n;i++){
        if(!used[i]){   //没有使用过
            p[x]=i;
            used[i]=1;  //标记使用
            dfs(x+1);
            used[i]=0;  //清空,准备下一步
        }
    }
}

(6)DFS判断图中有无环
分析:判断环我们只要判断图中有无返祖边(后向边)即可。返祖边:两点u,v,且u->v。vis[v] = 1,说明v已经被访问,但其子孙后代还没有被访问完。而u又指向说明u就是v的子孙后代,u->v是一条后向边(返祖边)。

2.广度优先搜索(BFS)
(1)工具:队列
(2)思想:弹出队列的队头,把图中元素加到队尾。
(3)代码:

void bfs(){
    q[tl++]=s;
    while(hd!=tl){
        x=q[hd++];  //弹队头
        for(i=1;i<=n;i++){
            if(mp[x][i]&&!vis[i]){  //连通且没被访问
                q[tl++]=i;  //加队尾
                vis[i]=1;   //标记访问
            }
        }
    }
}

3.记忆化搜索(DFS优化)
(1)算法分析:省去了重复的部分,使其变的更优。
(2)代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 1000
#define M 1000
using namespace std;
int n,m;
int u,v,c;
int s,to[M],l[M],ne[M],pre[N];
void add(int u,int v,int c)     //加边函数,邻接表存储
{
    to[++s]=v;
    l[s]=c;
    ne[s]=pre[u];
    pre[u]=s;
}
int f[N];
bool vi[N];
int cal(int k)
{
    if(vi[k]) return f[k];
    vi[k]=true;
    for(int i=pre[k];i;i=ne[i])
    {
        int x=to[i];
        f[k]=max(f[k],cal(x)+l[i]);
    }
    return f[k];
}
int main()
{
    cin>>n>>m;
    while(m--)
    {
        cin>>u>>v>>c;
        add(u,v,c);
    }
    for(int i=1;i<=n;i++) cout<<i<<' '<<cal(i)<<endl;
    return 0;
}

---------------------------------------------THE END-----------------------------------------------------

清北学堂—2020.1提高储备营—Day 1 morning(模拟、枚举、搜索)的更多相关文章

  1. 清北学堂—2020.1提高储备营—Day 4 afternoon(动态规划初步(一))

    qbxt Day 4 afternoon --2020.1.20 济南 主讲:顾霆枫 目录一览 1.动态规划初步 2.记忆化搜索 3.递推式动态规划 4.记忆话搜索与递推式动态规划的转化 5.状态转移 ...

  2. 清北学堂—2020.1提高储备营—Day 4 morning(数论)

    qbxt Day 4 morning --2020.1.20 济南 主讲:李奥 目录一览 1.一些符号与基本知识 2.拓展欧几里得,逆元与欧拉定理 3.线性筛法与积性函数(非重点) 总知识点:数论 一 ...

  3. 清北学堂—2020.1提高储备营—Day 3(图论初步(二))

    qbxt Day 3 --2020.1.19 济南 主讲:李奥 目录一览 1.图论(kruskal算法,最短路径算法,拓扑排序) 总知识点:图论 一.kruskal算法 1.目的:求图的最小生成树 2 ...

  4. 清北学堂—2020.1提高储备营—Day 3(图论初步(一))

    qbxt Day 3 --2020.1.19 济南 主讲:李奥 目录一览 1.图论(图.图的存储方式.最小生成树的定义) 总知识点:图论 前言:众所周知,图论是一个非常重要的部分,而这次集训也可以算从 ...

  5. 清北学堂—2020.1提高储备营—Day 2 afternoon(线段树、树状数组)

    qbxt Day 2 afternoon --2020.1.18 济南 主讲:李佳实 目录一览 1.线段树 2.二叉搜索树(略过) 3.树状数组 总知识点:基础数据结构(本人初学感觉好难) 一.线段树 ...

  6. 清北学堂—2020.1提高储备营—Day 2 morning(并查集、堆)

    qbxt Day 2 morning --2020.1.18 济南 主讲:李佳实 目录一览 1.并查集 2.堆 总知识点:基础数据结构 一.并查集 1.描述:并查集是一类十分常用的数据类型,它有着十分 ...

  7. 清北学堂—2020.1提高储备营—Day 1 afternoon(二分、分治、贪心)

    qbxt Day 1 afternoon --2020.1.17 济南 主讲:李佳实 目录一览 1.二分法 2.分治 3.贪心 总知识点:基础算法 一.二分法 (1)算法分析:二分法是一种暴力枚举的优 ...

  8. 清北学堂—2020.3NOIP数学精讲营—Day 1 morning 重点笔记

    qbxt Day 1 morning 重点笔记 --2020.3.8 济南 主讲:钟皓曦 1 正数%负数==正数 负数%正数==负数 负数%负数==负数 a%b的答案的符号取决于a的符号. 2 快速幂 ...

  9. 清北学堂 2020 国庆J2考前综合强化 Day7

    目录 1. 题目 T1 魔力石 题目描述 Sol T2 和 题目描述 Sol T3 数对 题目描述 Sol T4 海豹王国 题目描述 Sol 考场策略 1. 题目 T1 魔力石 题目描述 题目描述 小 ...

随机推荐

  1. 批处理版MPlayer播放器(甲兵时代原创批处理)(下)

    注意,由于空间不支持显示退格键,需要自己手动补上,方法如上图: 接上篇: 批处理版音视频播放器上(甲兵时代原创批处理) :Bc cls COLOR 2F echo. call :colour &quo ...

  2. MP3播放-基于MCI-API接口

    今天整理到音频播放的部分,本来就想抽取一个简单的接口方便以后可能会用到,然而不知不觉就把常用的功能都给一起封装好了,核心其实就是调用MCI的API接口,具体的功能就是变换不同的MCI指令来实现. == ...

  3. MingGW Posix VS Win32 - 明瓜娃的毒因

    MinGW-posix和win32纠缠的瓜娃子 官方首席佛偈(SourceForge)的官网下载页 法克油啊,让我一个小白情何以堪. 盘TA wiki posix wiki中文-UNIX API标准 ...

  4. NR / 5G - W-OFDM

  5. VFP 图形文件与剪切板互换的API解决方法

    在 VFP 中,凡遇图形处理,大多数情况下,都会涉及到图形文件与剪切板互换的情况.下面给出利用 API 解决的方法.这是原来从网上摘下来的,版权归原作者.基本处理的代码如下,你可以将其应用到你的代码中 ...

  6. 交换机 路由器 防火墙asa 安全访问、配置 方式

    这里交换机 路由器 暂时统称为  网络设备 我们一般管理网络设备采用的几种方法 一般来说,可以用5种方式来设置路由器: 1. Console口接终端或运行终端仿真软件的微机(第一次配置要使用此方式) ...

  7. Vlan 间路由的方法

    vlan间路由的方法主要有三种 1.通过路由器上多个接口实现 2.通过路由器上一个接口即单臂路由实现 3.通过三层交换实现   下面将每一中实现方法配合实验说明     第一:通过路由器上多个接口实现 ...

  8. android应用开发错误:Your project contains error(s),please fix them before running your

    重新打开ECLIPSE运行android项目,或者一段时间为运行ECLIPSE,打开后,发现新建项目都有红叉,以前的项目重新编译也有这问题,上网搜索按下面操作解决了问题 工程上有红叉,不知道少了什么, ...

  9. JS求1到100的累计值

    sum=0 for(i=1;i<=100;i++) { sum+=i } alert(sum)   作者:kerwin-chyl 文章链接:https:////www.cnblogs.com/k ...

  10. javascript30--day03--Css Variables

     相关视频链接:https://www.bilibili.com/video/av8481988/?p=5 相关github地址:https://github.com/soyaine/JavaScri ...