清北学堂—2020.1提高储备营—Day 1 morning(模拟、枚举、搜索)
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(模拟、枚举、搜索)的更多相关文章
- 清北学堂—2020.1提高储备营—Day 4 afternoon(动态规划初步(一))
qbxt Day 4 afternoon --2020.1.20 济南 主讲:顾霆枫 目录一览 1.动态规划初步 2.记忆化搜索 3.递推式动态规划 4.记忆话搜索与递推式动态规划的转化 5.状态转移 ...
- 清北学堂—2020.1提高储备营—Day 4 morning(数论)
qbxt Day 4 morning --2020.1.20 济南 主讲:李奥 目录一览 1.一些符号与基本知识 2.拓展欧几里得,逆元与欧拉定理 3.线性筛法与积性函数(非重点) 总知识点:数论 一 ...
- 清北学堂—2020.1提高储备营—Day 3(图论初步(二))
qbxt Day 3 --2020.1.19 济南 主讲:李奥 目录一览 1.图论(kruskal算法,最短路径算法,拓扑排序) 总知识点:图论 一.kruskal算法 1.目的:求图的最小生成树 2 ...
- 清北学堂—2020.1提高储备营—Day 3(图论初步(一))
qbxt Day 3 --2020.1.19 济南 主讲:李奥 目录一览 1.图论(图.图的存储方式.最小生成树的定义) 总知识点:图论 前言:众所周知,图论是一个非常重要的部分,而这次集训也可以算从 ...
- 清北学堂—2020.1提高储备营—Day 2 afternoon(线段树、树状数组)
qbxt Day 2 afternoon --2020.1.18 济南 主讲:李佳实 目录一览 1.线段树 2.二叉搜索树(略过) 3.树状数组 总知识点:基础数据结构(本人初学感觉好难) 一.线段树 ...
- 清北学堂—2020.1提高储备营—Day 2 morning(并查集、堆)
qbxt Day 2 morning --2020.1.18 济南 主讲:李佳实 目录一览 1.并查集 2.堆 总知识点:基础数据结构 一.并查集 1.描述:并查集是一类十分常用的数据类型,它有着十分 ...
- 清北学堂—2020.1提高储备营—Day 1 afternoon(二分、分治、贪心)
qbxt Day 1 afternoon --2020.1.17 济南 主讲:李佳实 目录一览 1.二分法 2.分治 3.贪心 总知识点:基础算法 一.二分法 (1)算法分析:二分法是一种暴力枚举的优 ...
- 清北学堂—2020.3NOIP数学精讲营—Day 1 morning 重点笔记
qbxt Day 1 morning 重点笔记 --2020.3.8 济南 主讲:钟皓曦 1 正数%负数==正数 负数%正数==负数 负数%负数==负数 a%b的答案的符号取决于a的符号. 2 快速幂 ...
- 清北学堂 2020 国庆J2考前综合强化 Day7
目录 1. 题目 T1 魔力石 题目描述 Sol T2 和 题目描述 Sol T3 数对 题目描述 Sol T4 海豹王国 题目描述 Sol 考场策略 1. 题目 T1 魔力石 题目描述 题目描述 小 ...
随机推荐
- centos7 配置虚拟交换机(物理交换机truck端口设置)(使用brctl)
转自:http://blog.csdn.net/qq_21398167/article/details/46409503 虚拟交换机配置 inux VLAN配置(vconfig) 安装vlan(vco ...
- 时序数据库 Apache-IoTDB 源码解析之文件数据块(四)
上一章聊到行式存储.列式存储的基本概念,并介绍了 TsFile 是如何存储数据以及基本概念.详情请见: 时序数据库 Apache-IoTDB 源码解析之文件格式简介(三) 打一波广告,欢迎大家访问Io ...
- Virus:病毒查杀
简介 小伙伴们,大家好,今天分享一次Linux系统杀毒的经历,还有个人的一些总结,希望对大家有用. 这次遇到的是一个挖矿的病毒,在挖一种叫门罗币(XMR)的数字货币,行情走势请看 https://ww ...
- O准备如何苟进复赛圈?华为软挑开挂指南(附赛题预测)
事先声明,这不是华为软挑的软广,我也不是海军. 这篇文章纯粹是心血来潮,原因是去年上传到github的参赛代码,前几天又有两个人star和fork了. 记得star热潮还是去年4月复赛刚结束的那几天, ...
- 简化 Spring Boot 项目部署,Flyway 搞起来
虽然我之前录了一个微人事(https://github.com/lenve/vhr)部署视频(新版微人事部署教程来啦),但是由于这次升级涉及到了 Redis 和 RabbitMQ,所以在本地跑微人事还 ...
- 日志框架 log4j2 全解析
概述 logging翻译为日志记录 那问题是什么是日志? 日志实际上是日记的一种,用于记录某个时间点发生了什么事情,比如大学老师的教学日志,工作日志等 为什么要记录日志? 在实际生活中记录日志主要为了 ...
- DOCKER绝对领域从2048到4069?不:25519,数字的飞跃,HTTP/2
这个标题花了几分钟,远远超过我构思以下内容的时间损耗,希望大家且看且珍惜,因为这是为数不多的cnblog特别标题 我记得很久以前,我开了一系列随笔,从第一篇揭发233的docker/machine开始 ...
- centos6.5和centos7.5统一字符集为zh_CN.UTF-8解决系统和MySQL数据库乱码问题
linux的服务器需要做的操作 centos6.5下: 修改默认字符集为 zh_CN.UTF-8,如果没有中文语言包可能需要安装中文语言包支持 [root@meinv01 ~]# yum groupi ...
- SHELL下打包文件
SHELL下打包文件 在我们拿下webshell的时候,想要获取数据或者源码往往会用菜刀或者蚁剑去打包,但是这个时候往往就会出现很多问题,列如打包失败,或者是打包得不完整等等. 这个时候如果对方是wi ...
- 解释为什么wait()和notify(), notifyAll()要放在同步块中
首先,wait()是释放锁的,因此wait()之前要先获得锁,而锁在同步块开始的时候获得,结束时释放,即同步块内为持有锁的阶段. 那为什么要设计同步块呢?或者说没有同步块会怎样呢?