清北学堂2019NOIP提高储备营DAY1
今天是第二次培训的第一天,关于NOIP的基础算法,主要内容如下:
$1.枚举
$2.搜索
$3.贪心
$1.枚举:
•定义:
枚举又叫做穷举,是一种基础的算法,其思路主要是:从问题中有可能的解集中一一列举出可能的解,再使用各种奇奇怪怪的方式将正确的答案找出
(接下来做几道题玩玩咯)
•例(1)
题目:一棵苹果树上长有n个苹果,每个苹果距离地面的高度用Ai来表示,小明的身高为h,试编一个程序求出小明最多能摘掉几个苹果。
分析:其实也么啥好分析的,就是将小明的身高和苹果的高度进行比较,如果苹果的高度小于小明的身高,那么小明就又能摘掉一个苹果啦!
核心代码归纳
scanf("%d%d",&n,&h);
for(int i=;i<=n;++i)
{
scanf("%d",A[i]);
if(A[i]<h) ans++;//这里就是将汉语翻译为C++,写在一个循环里比较方便
}•例(2)
题目:给出一个数n,判断这个数是否为素数;
分析:利用枚举的思想,枚举2到n-1中所有的数,用每个数去除以n,如果发现一个数能整除n,就说明n为合数;如果没有一个数能整除n就说明n为素数;
核心代码归纳:
bool pan_su_shu(int n)
{
for(int i=;i<=n-;+i++)
{
if(n%i==) return ;//如果为合数,就不是素数
}
return ;//如果为素数,就是素数
}buuuuuuuut,这个算法不能处理素数表的问题,那么就需要几个优化:
优化一:
埃拉托色尼筛法,具体来说就是将枚举的数字数目大大减少,只需要枚举到√n就可以得出答案
bool pan_su_shu(int n)
{
for(int i=;i<=sqrt(n);+i++)
{
if(n%i==) return ;
}
return ;
}优化二:
线性筛(详见素数筛法),复杂度是线性的;
优化三:
miller_rubbin素性检测,详见上面的博文QAQ
$2.搜索:
•分类:
(1)深度优先搜索
(2)广度优先搜索
•深度优先搜索(DFS)
核心思想:深度优先搜索的核心思想就是运用递归,将所有元素进行搜索,如果满足条件或者根本无法满足条件,就返回至上一个分叉点,选择另一条路径,再次搜索
•广度优先搜索(BFS)
核心思想:广度优先搜索的核心思想就是运用队列,将每个分叉节点的几个可能的存在存在队列里,对队列进行搜索,从而完成整个搜索
•以迷宫问题为例,用图来表示一下BFS和DFS的区别(by冯哲大神的PPT)
下面是深度优先搜索的图示:
下面是广度优先搜索的图示:
这样就差不多了,继续继续
•总结:
深度优先搜索的优点:代码短,占用空间少
缺点:找到的不一定是最优解,代码的复杂度很高
广度优先搜索的优点:保证找到的解一定是最优解,复杂度低
缺点:代码较长(不好背),占空间大,需要维护一个当前指向的集合(队列)
两种搜索各有利弊,有时在复杂度或空间的要求下,只能选取最优的,这时就需要对两种方式进行取舍。在NOIP的考试中,一定要进行正确的选择!!!
•深度优先搜索的例题:
八数码游戏:这个游戏大概是这样的----给你一个3*3的九宫格图,里面有1-8八个数字和0。0代表没有数字。你需要做的就是通过这个0,将其他的数字移动成以下局面:
1 2 3
4 5 6
7 8 0
求该操作的最小步数
思路浅析:这道题用的是BFS,具体思路是将每一次操作都进行一次转移-->转移成这个情况下可能到达的情况,最后就会到达目标情况,也就会求出最小步数
代码实现就不打了,今天就只做思路的浅析
•广度优先搜索的例题:
戳这里!!!(讲的是队列和广度优先搜索的例题)
$3.贪心
•啥是贪心?
简单来说,贪心就是一种每一步都选取局部最优解的算法。这种算法一般都符合直观思路,但是使用的话需要严格的证明,这就是为什么在NOIP中要对贪心算法的使用进行斟酌。但是如果有的毒瘤题实在不会,可以尝试用贪心算法骗个一两分
•贪心的例题:
例(1):
给定有n个农民,每个农民手中都有Ai个单位的牛奶,单价为pi,现在给你一个任务,要求你从这些农民手中买下m单位的牛奶,最省钱的方案为?
思路:这提是最简单的贪心算法,将么个农民手中牛奶的单价按从小到大的顺序排序,从最小单价的农民手中买牛奶,直到达到m单位
例(2);
有n个物品,每个物品都有Ai和Bi两个属性,现在将这n个物品按照某种方式排序,但是每个物品排序都有不同的代价,代价的计算公式如下:
假设第i个物品被放在了第j个位置,那么这个物品所需的代价为Ai*(j-1)+Bi*(n-j)
试编写一个程序,算出最小的代价
思路:对于这种计算公式的题目,有可能存在一个最小值,需要用贪心求解。这里介绍一个技巧:可以先将公式展开再化简,也就是将这个式子换一个方式来表示,有可能看出贪心的方法。对于这道题,我们可以将原式拆开,得到ans = ΣAi · j - Ai + Bi · n - Bi · j
这样,我们就可以发现,ΣBi*n-Ai是一个常数,变化的只有Σ(Ai-Bi)*j,那么就可以将Ai-Bi进行从大到小的排序,每次取最大的值(因为j会增大),这样就解粗来了!
see you tomorrow(金针菇)
引用资料:
冯哲大神的PPT
清北学堂2019NOIP提高储备营DAY1的更多相关文章
- 清北学堂2019NOIP提高储备营DAY3
今天是钟神讲课,讲台上照旧摆满了冰红茶 目录时间到: $1. 动态规划 $2. 数位dp $3. 树形dp $4. 区间dp $5. 状压dp $6. 其它dp $1. 动态规划: ·以斐波那契数列为 ...
- 清北学堂2019NOIP提高储备营DAY4
今天只有一上午,讲的东西不多,这里就整理一下高精的东西,数论部分请见my blog 高精度: 先讲一讲进制问题:十进制的二进制表示:以10为例, 10的二进制表示为1010 10的三进制表示为101 ...
- 2017清北学堂(提高组精英班)集训笔记——动态规划Part3
现在是晚上十二点半,好累(无奈脸),接着给各位——也是给自己,更新笔记吧~ 序列型状态划分: 经典例题:乘积最大(Luogu 1018) * 设有一个长度为 N 的数字串,要求选手使用 K 个乘号将它 ...
- 清明培训 清北学堂 DAY1
今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1) 高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...
- 7月清北学堂培训 Day 3
今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...
- 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)
清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
- 济南清北学堂游记 Day 1.
快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...
- 清北学堂提高突破营游记day1
上午7点半到的国防宾馆,8点开始的培训. 讲课人林永迪. 没错就是这个人: 他推荐的教辅:刘汝佳紫书,算法导论(也就看看..),刘汝佳白书 先讲模拟.(貌似就是看题论题. 然后贪心. 贪心没有固定的模 ...
随机推荐
- 课堂练习6--统计txt文本
统计文本中26个字母的频率: package bao; import java.io.BufferedReader; import java.io.FileReader; import java.io ...
- Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序
在上一讲中, 我们着重的讲了表达式的一些基础知识和基本的使用, 今天我们来实战一把, 对Map的Value值排序进行简化. 在以前的思路我们的做法如下: /** * * Map根据value排序; * ...
- Robust Principal Component Analysis?(PCP)
目录 引 一些微弱的假设: 问题的解决 理论 去随机 Dual Certificates(对偶保证?) Golfing Scheme 数值实验 代码 Candes E J, Li X, Ma Y, e ...
- Vue—组件传值及vuex的使用
一.父子组件之间的传值 1.父组件向子组件传值: 子组件在props中创建一个属性,用以接收父组件传来的值 父组件中注册子组件 在子组件标签中添加子组件props中创建的属性 把需要传给子组件的值赋给 ...
- POJ 1915 Knight Moves
POJ 1915 Knight Moves Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29 ...
- vue配置jquery和bootstarp
jquery: 1.npm install jquery --save-dev 引入jquery. 2.在webpack.base.conf.js中添加如下内容: var webpack = requ ...
- 为什么qt成为c++界面编程的第一选择
为什么qt成为c++界面编程的第一选择 一.前言 为什么现在QT越来越成为界面编程的第一选择,笔者从事qt界面编程已经有接近8年,在这之前我做C++界面都是基于MFC,也做过5年左右.当时为什么会从M ...
- wx.request 使用数据
小程序中,怎么使用wx.request返回的数据??? 在你的js页面中 主要是这句话 var that=this; 为什么呢?因为使用过jquery的ajax的朋友都知道.在ajax函数中的this ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
- 介绍一款自动给添加不同浏览器CSS3前缀的插件~Autoprefixer(附其他前端开发插件)
正文 自动给CSS文件添加不同浏览器的CSS3前缀:Autoprefixer 安装 只需兼容主流浏览器 正常情况使用:(在书写完的CSS样式文件中,按F1,选择Autoprefixer CSS) 这时 ...