清北学堂培训2019.4.28
Day 1(冯哲)
今天的内容很杂但却都是基础知识
主要分为下面几个点
枚举
枚举也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素。用题目中给定的检验条件判定哪些是无用的,哪些是有用的。能使命题成立的即为其解。
有几个非常非常简单的例题:
这个题目类似于洛谷P1046 陶陶摘苹果
下放代码(不行不行太水了):
#include<iostream> #include<cstdio> using namespace std; int n,x,ans,s[101]; int main() {cin>>n>>x;for(int i=1;i<=n;i++){cin>>s[i];if(x>=s[i]){ans++;}}cout<<ans; } /* //洛谷题解qwq #include<iostream> using namespace std; int n,s[10],ans; int main() {for(int i=0;i<10;i++)cin>>s[i];cin>>n;for(int i=0;i<10;i++)if(n>=s[i]-30)ans++;cout<<ans; } */
还有就是有关素数判定最laji的方法
#include<iostream> using namespace std; int main() {int m;cin>>m;for(int i=2;i*i<=m;i++){if(m%i==0){cout<<"合数";return 0; }}cout<<"素数"; }
没错,就是辣么的简单qwq【当然又双叒叕讲了筛法】
是个正常人都知道用哪个啊
还有就是有关枚举的优缺点:
优点:
- 简单明了,分析直观
- 能够帮助我们更好地理解问题
- 运用良好的枚举技巧可以使问题变得更简单
缺点
- 时空间效率低
- 往往没有利用题目中的特殊性质
- 产生了大量冗余状态
搜索
本质上是一种枚举,搜索算法一般做一些普通的枚举不方便表达状态的情况 。
例题:
给出一个N*N的迷宫,求从起点出发,不经过障碍物到达终点的最短距离
解决这类问题一般有两种方式
1.深度优先搜索(DFS【大法师】)
2.广度优先搜索(BFS【笨法师】)
前置知识:
栈:后进先出的数据结构
支持的操作:
加入一个数
删除最晚加入的数
查询最晚加入的数
实现:一个数组+一个用于指向栈顶位置的变量
系统内部递归即使用了栈
例如求斐波那契数列的第n项 :
队列:先进先出的数据结构
支持的操作:
加入一个数
删除最早加入的数
查询最早加入的数
实现:一个数组+头下标+尾下标
DFS的做法图解:
(a) (b) (c)
(d)
DFS:
优点:
- 占用空间小(只需要记录从起点到当前点的路径)
- 代码短
缺点:
- 获得的不一定是最优解
- 在图上路径非常多的时候,复杂度可能会达到指数级别
BFS的做法图解:
(a) (b) (c)
(d) (e)
BFS:
优点:
- 找到答案时找到的一定是最优解
- 复杂度不会超过图的大小
缺点:
- 需要维护一个“当前箭头的集合”
- 空间较大
BFS与DFS的区别:
- DFS:能走就走,走不了才回头(比较决绝)
- BFS:我全都要(要不是笨法师呢qwq)
应用:
G = (V , E)被称为一张图,则其包含两部分:
1.点集|V | = n,即有n个点,标号分别为1, 2, ..., n
2.边集|E| = m,有m条边(ui, vi),表示第ui个点和第vi个点有一条边相连.
边有向边和无向边之分,(u, v)是无向边,则u能直接走到v,v能直接走到u.
还有就是存图的问题:
有这么几种方法:
- 邻接矩阵存储,用A[x][y] = 0/1表示.优点是便于加删,但是需要O(N^2)的空间.
- 直接用vector存下所有的边(邻接表法).优点是空间和访问比较快,缺点是删除比较麻烦.
- 之前发的链式前向星
图的连通块
在本课中我们基本只考虑无向图.
若a沿着边走可以到b,则称a与b在同一个连通块中,称a与b连通.
显然a与b连通,b与c连通,则a与c肯定连通.
一张图可以被分成若干个两两连通的块.
这里就只放一个例题吧:
八数码游戏
八数码游戏是一种非常无聊的游戏。给定一个3*3的格子,在其中8个格子中放置整数1 ∼ 8,
剩下一个格子空着(用0表示)。每次操作时,你可以选择将某个与空格相邻的数字移动到空
格上。给定一个初始局面,求最少需要多少次操作才能将局面变成
1 2 3
4 5 6
7 8 0
状态?0 ∼ 8 的一个排列
转移?一步能够到达的其他排列
BFS or DFS? BFS
按照这个思路,我们就能很好的得出答案:考虑倒着进行游戏过程。所有状态都是由
最终状态转移得到的因此我们以最终态为起点做一遍BFS即可预处理出所有状态的答案
贪心
每一步都取当前的最优解的思想;一般来说符合直观思路;
需要严格的证明;OI中使用多个错误的贪心策略进行加成有时会有良好的效果
例一
给定N个农民,第i个农民有Ai单位的牛奶,单价Pi;
现在要求从每个农民手中购买不超过Ai单位,总共M单位的牛奶。
求最小花费
(洛谷P1208 [USACO1.3]混合牛奶 Mixing Milk)
#include<bits/stdc++.h>using namespace std;#define N 5001 #define cmp zhx_ak_ioi//神仙保佑int n,m,i,sum;struct node {int x,y; }a[N];inline int cmp(node g,node c) {if(g.x!=c.x){return g.x<c.x;}else {return g.y>c.y;} }int main() {cin>>m>>n;for(i=1;i<=n;i++){cin>>a[i].x>>a[i].y;}sort(a+1,a+n+1,cmp);i=1;while(m){if(a[i].y){a[i].y--;sum+=a[i].x;m--;}else{i++;}}cout<<sum; }
二分
给定一个单调的函数/数组;给定一个值,求这个值是否存在;
或者找到这个值应当存在的位置
由于数组有序,不妨认为他单调递增
假设Ai > x,则必然有∀j > i, Aj > x
假设Aj < x,则必然有∀j < i, Aj < x
二分的原理就是每次在待定区间中选择mid。
必然可以确定一边是没有意义的。每次问题的规模缩小 12
因此复杂度为O(logN)
顾名思义,就是对答案进行二分
对于某些要求“满足某条件的最小值”类的问题,对答案进
行二分,假设答案不超过mid,则问题变为“满足某条件且
某值不超过mid”的判定性问题。
常用于最大值最小化类问题。
在二分答案之后往往需要一个贪心策略。
相对来说理解起来就简单了
分治
思想:将一个问题划分成若干个(一般都是分成俩)子问题分别解决每个子问题后(也可能是前,还可能一前一后之类的)
将各个子问题组合起来得到原问题的答案。
这里经典的就是快速幂了
归并排序
基本思想:先将整个数组分成两个部分,分别将两个部分排
好序,然后将两个排好序的数组O(n)合并成一个数组。
我们将问题分为两个阶段:分、治
分:
对于每个长度> 1的区间,拆成两个[l, mid]区间和[mid + 1, r]区间
直接递归下去
治:
我们认为在处理区间[l,r]时,已经有[l,mid]和[mid+1,r]内分别有序
这一次的操作就是合并两个有序序列,成为一个新的长有序序列
用两个指针分别指向左右分别走到哪了即可
有关题目的链接:
搜索: 8数码 http://poj.org/problem?id=1077 走迷宫 http://poj.org/problem?id=3984 推箱子 http://acm.hdu.edu.cn/showproblem.php?pid=1254 贪心: 纪念品分组 洛谷P1094 例四:http://codeforces.com/contest/954/problem/E 例五:http://codeforces.com/contest/898/problem/D 二分: 跳石子:NOIP往年题,自行查找题库 例三 http://codeforces.com/contest/954/problem/G 三分 http://codeforces.com/contest/939/problem/E 分治: 平面最近点对:http://acm.hdu.edu.cn/showproblem.php?pid=1007 例二:http://codeforces.com/contest/768/problem/B 例一:http://codeforces.com/contest/97/problem/B
转载于:https://www.cnblogs.com/gongcheng456/p/10783616.html
清北学堂培训2019.4.28相关推荐
- 清北学堂培训2019.4.4
第一次培训,心情有点激动(尽管没了清明节),还见到了各地的dalao们,十分开森 Day 1(李昊dalao) 上午篇 上午呢,主要讲了关于高精,快速幂,膜模意义下的运算,筛素数,费马小定理以及欧拉定 ...
- 清北学堂培训2019.4.7
Day 4(没错,又是他→钟皓曦) 上午,考了个试(悲惨爆零[好像是多加了几个文件夹]) 下午是题目讲解和概率期望的知识(貌似网上好像能搜到他的课件) 这里也没什么奇特的,主要是一些定义的知识(这里采 ...
- 清北学堂(2019 4 28 ) part 1
今天主要用来铺路,打基础 枚举 没什么具体算法讲究,但要考虑更优的暴力枚举方法,例如回文质数,有以下几种思路: 1.挨个枚举自然数,再一起判断是否是回文数和质数,然而一看就不是最优 2.先枚举质数再判 ...
- 清北学堂培训2019.4.6
Day 3(还是我们熟悉的钟皓曦大佬) 讲了神奇的组合数问题(据说各个网站的组合数问题都是钟皓曦出的,所以他说都是好题) 组合数需要用到下面两个原理和两个神奇的东西 加法原理:具有性质A的事件有m个, ...
- 清北学堂培训2019.4.29
Day 2(冯哲) 今天的内容主要分为一下几部分 二叉搜索树 二叉搜索树(BST)是用有根二叉树来存储的一种数据结构,在二叉树中每个节点代表一个数据. 每个节点包含一个指向父亲的指针,和两个指向儿子的 ...
- 7月清北学堂培训 Day 5
今天是钟皓曦老师的讲授~ 动态规划 动态规划的三种实现方法: 1.递推: 2.递归: 3.记忆化: 举个例子: 斐波那契数列:0,1,1,2,3,5,8-- Fn = Fn-1 + Fn-2 1.我们 ...
- 8月清北学堂培训 Day4
今天上午是赵和旭老师的讲授~ 概率与期望 dp 概率 某个事件 A 发生的可能性的大小,称之为事件 A 的概率,记作 P ( A ) . 假设某事的所有可能结果有 n 种,每种结果都是等概率,事件 A ...
- 五一清北学堂培训之Day 3之DP
今天又是长者给我们讲小学题目的一天 长者的讲台上又是布满了冰红茶的一天 ---------------------------------------------------------------- ...
- 7月清北学堂培训 Day 1
基础算法 1. 模拟算法 面向测试算法 模拟算法的关键就是将人类语言翻译成机器语言. 要做到以下两点: 1.优秀的读题能力: 2.优秀的代码能力: 程序流程图: 读入,循环处理指令,输出: 读题是很重 ...
最新文章
- Lifecycle Activity和Fragment生命周期感知组件 LifecycleObserver MD
- 【GANs入门】pytorch-GANs任务迁移-单个目标(数字的生成)
- centos mate桌面_CentOS 7安装桌面汇总
- 信息系统项目管理案例2
- 权益证明协议中的拜占庭容错
- python用pip安装pygame_安装pygame和pip的问题以及过程
- Linux之父:开源不为金钱名利只为娱乐
- C语言编译和链接详解(通俗易懂,深入本质)
- python输入数字是什么类型的游戏_“数字炸弹”——一个练习Python基础知识的小游戏...
- C++之继承探究(十二):子类的构造、析构和赋值运算符重载
- Win8 64位安装Oracle 11g时错
- TypeError: tensor is not a torch image.
- 某项目的双代号网络图如下所示_系统集成项目管理工程师5天备考第3天第1-2学时...
- Nginx作为静态资源服务器
- matlab ctradon函数,Radon变换入门matlab CT原理
- 专访架构师周爱民:谈企业软件架构设计
- 深入浅出IO流知识——基础流
- SEH X64(2)
- vysor技术实现原理(投屏不包括鼠标控制)
- 【Hello Linux】Linux入门
热门文章
- 爬虫第四课:猫眼电影
- 整理Glide方法使用含义(毛玻璃效果,实现圆角等)
- CIO应具备的基本素质要求(zt)
- Win10中Pro/E鼠标滚轮不能缩放该怎么办?
- 为什么说在数字角频率中:π附近的频率分量就是高频分量?
- 【嵌入式开发】手把手教你4418/6818开发板屏幕修改 本文转自迅为: http://www.topeetboard.com 开发平台:iTOP-4418/6818开发板 44186818屏幕
- 1.5 极限运算法则
- 青龙整合傻妞机器人实现QQ聊天短信登录
- rime|小狼毫 敏感词过滤效果
- (python 作业)线性回归预测房价