内容提要

贪心

分治

分块

搜索


接着昨天的讲

过河问题

考虑AB是最快的人,CD是最慢的人,要把CD两个人送过河,只有两种方案,牵扯到四个人,并且n个规模的原问题化成了n-2个规模的子问题

那么最后有两个情况,四个人和三个人,如果是四个人就直接按刚才的方法搞一搞就好了,如果是三个人的话,就有两个方案,一个是A来回送,一个是AB一起操作,就是在两个之间取min就好了

贪心算法在骗分时的运用主要集中在两点:

1.贪心算法失效时该如何补救?

2.如何利用贪心算法来提升自己的一个暴力算法?

1.贪心算法与随机化算法的结合(例如模拟退火)

在决策时有概率接受比当前情况差的方向

在搜索到结果时以一定概率跳出当前解,重新开始贪心

在贪心开始的时候,利用随机化选择多个起点开始贪心,取其最小值

2.贪心算法与搜索算法的结合

通过一定程度地选择次优解来计算答案,k-优搜索策略

结合贪心与搜索的策略,在大范围内贪心(用贪心剪枝),收束到小范围后开始搜索

分治:

分治分治,分而治之,分治算法就是将一个大问题划分为几个更小规模的问题并加以解决,通过解决子问题最后解决总问题。

分治算法在OI中的运用主要在两个方面:

1.基于二分查找、三分查找的运用

2.将题目划分为更细小的子问题的运用

我们将按顺序来讲解这两个方面

二分的本质是:在一个有序区间内确定一个边界,在边界的一边的元素满足某种性质,而另外一边不满足;

故二分经常用于解决如下类型的问题:

1.简单的二分查找

2.二分答案(即求一个单调函数在满足某个性质下的最值)

3.最值的最值(最常见的二分题类型)

差分前缀和加二分

你现在需要给小A CntA 个自然数,给小B CntB 个自然数

但是给小A的自然数不能被x整除

同理给小B的自然数不能被y整除

请问需要给的最大的那个自然数最小是多少?

二分答案 v ,因为 a 不要被 x 整除的数,所以我们可以

先把 被 x 整除的数但不被 y 整除 给b,

再把 被 y 整除的数但不被 x 整除 给a。

然后剔除所有被 x*y 整除的数

剩下的数与 x 和 y 都互素,判一下能不能好好的分配就可以

三分

三分的难度要略低于二分(因为变出来的花样少)

三分的用处在于求一个单峰函数的最值

单峰函数,例如:

代码

如果函数不是单峰的该怎么办?

分块

分块算法相当于是一个对于线段树和树状数组算法的下位替代品

由于其算法简单粗暴十分好写故广泛地运用于骗分领域(滑稽

1.给出一个长度为n的数列,以及m个操作,支持区间加法,单点查询

把长为n的数组分成√n块,对其中某一个区间[l,r]进行修改

  1. l和r在同一块里    直接跑,复杂度不超过√n
  2. l和r在相邻的块里    直接跑,复杂度不超过2√n
  3. 其他情况    把l和r所在的块暴力增加,对中间的块打标记,复杂度不超过3√n

2. 给出一个长为n的数列以及m个操作,支持区间加法,并询问区间内小于等于某个数x的元素个数

  每个块内部排序

  1. l和r在同一块里    直接跑√n
  2. l和r在相邻的块里    直接跑 2√n
  3. 其他情况    两边暴力中间二分√n logn+2√n

3. 给出一个长为n的数列以及m个操作,支持区间开方,区间求和

我们发现一个longlong范围的数最多六次开方就会变成0或1

我们如果某个区间里每个数都是0或1就不用管他了

复杂度o(n√n+6n)

记录color[i]表示下标为i的球的颜色

Pre[i]表示前一个颜色为color[i]的球的颜色(前一个颜色和i相同的球)

引理:

如果Pre[i]<x<i,那么[x,i]区间内只有一种颜色为color[i]的球

所以:

查询[l,r]中有多少不同的颜色

只需要查询[l,r]种所有pre[i]<l的i的个数

对于修改,只需要对每一种颜色开一个set,修改的时候用类似于链表的方式将后驱的pre指向前驱就好了

或者暴力改也可以qwq这个题修改比较水、

搜索

DFS

深搜,电风扇,大法师,回溯

是自己欺骗自己的好东西(滑稽)

较多用于走迷宫和树的遍历中(以及大名鼎鼎的网络爬虫)

虽然要利用栈进行递归但是不可思议地空间依旧比广搜小

一般结合强力的剪枝服用时有奇效

由于不需要搜索完所有的节点也能出一些结果,故在骗分界有广泛的好评

在寻找最优解的问题上基本被广搜吊打

BFS

杀人放火,居家常备,解决最优性问题有两把刷子

擅长答案在搜索树比较浅的位置时的情况

虽然名字叫广度优先搜索,但其实并不喜欢很宽的搜索树

状态的表示并没有深搜来的舒服

并没有很好的剪枝策略,垃圾节点一大堆

空间上完全被锤爆了,可以说是一点都没有考虑过内存的想法

最优解:广搜

T成狗:深搜

解个数:深搜

双向广搜

当你知道起点和终点时就可以使用的操作

能大大减少广搜扩展到垃圾节点

不过就算这样内存依旧表示很不友好

总的一句话,比广搜只好不差(当然代码量除外)

其实是有双向深搜和双向A*的,可是姿势太骚闪了自己的腰,并木有什么卵用

迭代加深搜索

算是广搜向内存妥协后的奇葩产物

先枚举深度,再dfs

骚气的结合了广搜和深搜的特点

和第一眼给人的逗比影响截然相反,迭代加深搜索在面对庞大的搜索树时往往表现出了值得信任的优异表现

能写出 more and more 骚气的操作

其实也是有迭代加宽搜索的,不过价值和他给人的第一印象一样不靠谱就是了

剪枝

常用的剪枝主要有以下几种:

可行性剪枝

最优性剪枝

记忆化搜索

搜索顺序以及代码细节

启发式剪枝

其实做题时想不想得到全靠脑洞,有没有效果全看缘分

剪枝一:如果在搜索的过程中体积小于0 或者当前半径或高度小于剩余要制作的层数(因为每层必须是相差1的,当前半径或高度小于要制作的层数,肯定不能制作完)就要剪枝.

剪枝二:当前剩下m层需要制作,可以预测制作这m层蛋糕最少需要多少体积,如果这个最少的体积还大于当前剩余的体积,那个这个不必继续搜索,所以要剪枝。

剪枝三:因为要求求最小表面积,如果当前枚举到的面积已经大于要求得的最优表面积,就要剪枝,但是这个剪枝还可以更优化,根据剪枝二的启发,如果当前枚举到的面积加上制作剩余m层蛋糕所要花费的最小表面积大于已经求得的最优解,那么剪枝。

剪枝四:因为体积必须为N,根据剪枝二,如果剩下m层蛋糕制作都按照最大的来,依然不能够使用完剩余的体积那么也要减掉。

qbzt day2 上午的更多相关文章

  1. PKUSC 模拟赛 day2 上午总结

    今天上午考得不是很好,主要还是自己太弱QAQ 开场第一题给的图和题意不符,搞了半天才知道原来是走日字形的 然后BFS即可 #include<cstdio> #include<cstr ...

  2. 清北澡堂 Day2 上午 一些比较重要的关于数论的知识整理

    1.算数基本定理: 对于任意的大于1的正整数N,N一定能够分解成有限个质数的乘积,即 其中P1<P2<...<Pk,a1,a2,...,ak>=1; 证: 存在性: 若存在最小 ...

  3. QBXT T15214 Day2上午遭遇

    题目描述 你是能看到第一题的 friends呢. -- hja ?座楼房,立于城中 . 第?座楼,高度 ℎ?. 你需要一开始选择座楼,跳. 在第 ?座楼准备跳需要 ??的花费. 每次可以跳到任何一个还 ...

  4. Day2上午解题报告

    预计分数:100+0+60=160 实际分数:100+0+60=160 mmpT1数据错了... T1遭遇 题目描述 你是能看到第一题的 friends呢. —— hja ?座楼房,立于城中 . 第? ...

  5. day2 上午 游戏 对应关系--->判断素数---->多重背包 神题

    #include<iostream> using namespace std; int n; ; ]; long long p[maxn]; long long dp[maxn][maxn ...

  6. qbzt day7上午

    由于优盘咕咕咕了,所以这篇就咕咕咕了 以后还会补上的 qwq

  7. qbzt day6 上午

    还是合并石子,但是这次可以任意两个合并,并且求最大异或和 f[s]表示把s所对应的的石子合并为一堆的最小代价 最后求f[2^n-1] 怎么转移? 最后一次也是把两堆合并成一堆,但是会有很多情况,可以枚 ...

  8. qbzt day5 上午

    动态规划 递推  递归   记忆化搜索 斐波那契数列 1.用其他已经计算好的结果计算自己的结果(递推) 2.用自己的值计算别人的值(考虑对之后的项做出的贡献) cin >> n; f[]= ...

  9. qbzt day4 上午

    图论 最短路:dijkstra   spfa   floyd 最小生成树:kruskal 连通性:bfs/dfs    tarjan(强连通分量) 其它:拓扑排序    LCA 齿轮: 图的dfs树只 ...

随机推荐

  1. 基于TCP和UDP的socket

    为什么学习socket 你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引入,文件引入import等等,我可以在程序中获取到另一个文件的 ...

  2. Python基础编程闭包与装饰器

    闭包的定义 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 闭包格式: def func(): lst=[] def inner(a): lst.append(a ...

  3. Springboot+Mybatis AOP注解动态切换数据源

    在开发中因需求在项目中需要实现多数据源(虽然项目框架是SpringCloud,但是因其中只是单独的查询操作,觉得没必要开发一个项目,所以采用多数据源来进行实现) 1.在配置文件中创建多个数据连接配置 ...

  4. lilybbs-faq - linux入门以及百合 Linux 版精华区导读

    QUESTIONS 问题与解答 不需要任何命令的简单介绍 历史 (APUE 提到了1990年之前的unix历史,还有各种标准 ANSI ISO IEEE posix xpg3.... 但是linux ...

  5. adam优化

    AdaGrad (Adaptive Gradient,自适应梯度) 对每个不同的参数调整不同的学习率, 对频繁变化的参数以更小的步长进行更新,而稀疏的参数以更大的步长进行更新. gt表示第t时间步的梯 ...

  6. bean获取Spring容器

    Person.java public class Person implements ApplicationContextAware{ private String name; private int ...

  7. IDEA开发初始化设置

    一.基本设置 1. 自动生成 serialVersionUID 的设置 2. 设置文件注释 3. 隐藏项目文件(夹) .git;.gitignore;.idea;.idea/.;.mvn;mvnw;m ...

  8. Oracle 9i,10g,11g各自alert日志的位置

    10g&9i的alert日志: 进入oracle:[zhangshengdong@oralocal1 ~]$ sudo su - oracle[oracle@oralocal1 ~]$ sql ...

  9. hive group by distinct区别以及性能比较

    Hive去重统计 相信使用Hive的人平时会经常用到去重统计之类的吧,但是好像平时很少关注这个去重的性能问题,但是当一个表的数据量非常大的时候,会发现一个简单的count(distinct order ...

  10. Spring Cloud(1)相关概念

    单点系统架构 传统项目架构 传统项目分为三层架构,将业务逻辑层.数据库访问层.控制层放入在一个项目中. 优点:适合于个人或者小团队开发,不适合大团队开发. 分布式项目架构 根据业务需求进行拆分成N个子 ...