牛客算法竞赛入门班笔记整理-01

01 - 枚举(尺取法、前缀和、差分等)、贪心

课程笔记

一些零碎的知识

2n <= n! <= nn
108->超过了可能会tle
231 - 1 = 2147483647
long long -> 263-1
unsigned -> 232-1

计算变量所占的空间
8位二进制 = 1个字节
1024字节 = 1KB
1024KB = 1MB
1024MB = 1GB

比赛时题目的空间限制位为512M,在没有递归等其他消耗下,且只需要开一个int型的数组,那么这个数组最大可以开到什么数量级
512 * 1024 * 1024 * 8 / 32
可以近似为->108

一个长度为10^6的double类型数组占多少空间(数量级)
106 * 64 / 8 * 1024 * 1024
-> 8M

枚举

一一列举,不重复,不遗漏

优化枚举的基本思路:减少枚举次数

  1. 选择合适的枚举对象
  2. 选择合适的枚举方向——方便排除非法和不是最优的情况
  3. 选择合适的数据维护方法——转化问题
前缀和

给一个数列{an}(1≤n≤100000),有q(1≤q≤100000)此询问,每次询问数列的第li个元素到第ri个元素的和。

用sum[i]存储前i个数的和,那么sum[i] = sum[i - 1] + a[i],当我们要查询第li个元素到第ri个元素的和时,用sum[ri] - sum[li - 1]即可
这样单次查询为O(1),总复杂度为O(n + q)
sum[i] -> 前缀和

差分

给一个数列{an}(1≤n≤100000),有q(1≤q≤100000)此修改,每次把数列中的第li
到第ri的每个元素都加上一个值ki,求所有的修改之后每个数的值。
——将对区间的修改变为对区间端点的修改

考虑在区间加的过程中,有什么值是在区间端点处发生变化,而区间内是没有变化的?
-> 是每个数与前一个数的差值

考虑用数组delta[i]来维护第i个数和其前一个数的差值(可以默认第一个数前面有一个0),然后当需要将[li, ri]区间的每一个数+ki时,只需要修改delta[li]和delta[ri + 1]即可

最后,对delta[i]求一次前缀和,就可以得到数列每个元素的值。

用数组delta[i]来维护第i个数和其前一个数的差值的办法为差分

差分和前缀和是对称的操作
-> 对差分数组求前缀和为原数组
-> 对前缀和求差分也会得到原数组

校门外的树
讲解时提到了离散化

给定长度为n的整数数列以及整数S,求出总和不小于S的连续字串的长度的最小值,如果解不存在,则输出0
->尺取法 时间复杂度O(L+R)
可以试一下这个题目来练练手
POJ - 3061

熄灯问题
->第一列枚举,剩下的推理

类似的题目
POJ - 3279

位运算

位运算比数值运算快

  • << 左移 在数值上等价于*2
  • >> 右移 在数值上等价于/2
  • | 或 1|0=1
  • & 与 1&1=1
  • ~ 取反 对单个数进行取反
  • ^ 异或 相同为0,不同为1 也可理解为不带进位的加法 任何数异或0为0,任何数异或1即为取反
  • 注意位运算的优先级问题 涉及位运算注意套括号

^1 取反 ^0没变
^1^1 没变· ^0^0没变
a=a^b;
b=a^b;
a=a^b;
实现了交换
a’ = a^b;
b’ = a’^b = a^b^b = a;
a’’ = a’^b’ = a^b^a = b;

  • x >> 1 去掉最后一位
  • x << 1 在最后加一个0
  • (x >> 1) + 1 在最后加一个1
  • x | 1 把最后一位变成1
  • (x | 1) - 1 把最后一位变成0
  • x ^ 1 最后一位取反
  • x | (1 >> (k - 1)) 把右数第k位变成1
  • x & (~(1 << (k - 1))) 把右数第k位变成0
  • x ^ (1 << (k - 1)) 右数第k位取反

负数在计算机中以补码的形式存储
补码:原码取反+1

贪心

在对问题求解时,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
能够使用贪心算法的问题都是能严格证明贪心出的局部最优解就是所求的全局最优解。
每次都选看起来最好的。

例题3
在0到L的数轴上有n个区间[li, ri],现在需要你选出其中进项多个区间,使其两两不相交。(n <= 100000)
->选择结束时间尽量早的
->提到了循环不变式

例题4
给n个活动,每个活动需要一段时间Ci来完成,并且有一个截止时间Di,当完成时间ti大于截止时间完成时,会扣除ti - Di分,让你找出如何使用使自己所扣分的最大值最小(n <= 100000)
最后推出->DA <= DB

例题5 国王的游戏
最后推出 -> LARA <= LBRB

第一期视频地址
第一期题目的地址
最后的碎碎念
弹幕的大家都好可爱啊
dp=单排
签到=ak
提交=ac
哈哈哈哈哈哈哈哈哈哈哈当时看弹幕的时候笑死
看到弹幕发现大家都好强,自己也要加油!因为太菜了代码还没附上,等做出来的应该会附上代码的。

你可能感兴趣的:(算法)