停课期间-考试总结Ⅱ

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27121257/article/details/82934475

距离noip(退役)还有四十多天吧,时间不多了。



10.3

贪心题做得我头痛,好吧,这种思维题向来都是我的弱项。

  • 区间相交问题
    额,基于对于此类贪心题的基本印象,果断按照右端点从大到小排序,然后 G G GG (幸好贪心还给分)
    正解是从小到大排序,一路推过去
  • 任务时间表问题
    也算是一道经典的题目,按照惩罚重的有限完成
  • 非单位时间任务安排问题
    上一题的升级版。
    其实考场上有想到类似dp的思路,然而…貌似又忘了。
    先按照时间限制排序,然后直接枚举就行了(也不能完全算dp吧)
  • 多元 Huffman 编码问题
    数据貌似有点问题。
    合并果子的升级版。
    最小值的话,每次最小的 k k 个合并即可。
    最大值的话,每次只合并两个。
  • 登山机器人问题
    这题就当我眼瞎吧,有看漏条件了(每个机器人至少走一步)
    先处理出每个机器人走一步的代价,然后每次取最小即可
  • 可重复最优组合分解问题
    头痛的题,经过一段玄学的分析(表示这一题我不做太多的要求,随缘吧)可以得出:尽量分解成 5 5 ,然后根据其余数分类讨论吧,差不多 O ( 1 ) O(1)

10.4

算是一套模拟题吧,题目略水,然而最后一题连搜索都没打,直接水部分分去了( k = 1 k = 1 k = 2 k = 2 的情况)。

  • 进制转换
    算是一道水题吧,如果理解了进制转换的原理,那么直接上就行了。
    注意 0 0 的情况
  • 方格取数
    一道很经典的 d p dp 题,四(三)维dp。
  • Car的旅行路线
    重点在于建图,有点难码(看着就心累)。剩下的交给最短路就行。
  • 矩形覆盖
    为什么我第一感觉动归???
    由于数据范围很小,所以直接搜索就行了。枚举每个点属于哪个矩形,一路扫过去。

10.4–NOIP提高组模拟赛Day2

晚上找不到事做,于是去水了一下比赛。感觉还行,有数据结构题比较合我胃口。

  • Agent2
    区间修改加上单点查询,直接树状数组就好了。如果不放心的话,可以加上离散化先。
  • Portal2
    一道模拟题。题目描述的感觉太强烈了,总是让人想到了栈,于是直接上吧(其实看到 m o v e move 操作的时候是有点虚的)。
    其实晚上回寝的时候突然醒悟,不是可以用双向链表(一个正一个反,方便 m o v e move 操作)么。。。
  • War2
    看到题的第一眼感觉像是个图,往后瞄一眼数据范围( N 18 N \leq 18 ),果断状压 D P DP
    PS:考试的时候犯傻了,没事排了个序。实际上,对于状态的枚举直接从 0 2 k 0 \to 2^k 就行了。刷表法的话,某位加上 1 1 绝对比原数大;填表法的话,某位去掉 1 1 绝对比原数小。

10.5

题目还行吧,就是有点暴力(话说零几年的题怎么就这么暴力呢)。
数据还是有点水的,有点运气的成分。

  • 神经网络
    拓扑排序,直接过去就行了。(试卷题目的范围有误)
  • 侦探推理
    毒瘤的码农题,本来思路应该谁对的,但是由于时间关系,就直接骗分了(只完成了读入)
    s t r i n g string s t r i n g s t r e a m stringstream 还是挺好用的。
    思路其实很简单,同时枚举凶手和星期就行了,然后根据说谎人数来判断。
  • 加分二叉树
    典型的区间 D P DP ,略
  • 传染病控制
    只能说人品好吧,贪心骗了 90 90 分。(有反例)
    不过正解也挺简单的,就是直接枚举每层删哪条边。

10.6

一道毒瘤的字符处理题,一道玄学的结论题???
还有被 s o r t sort 坑的 80 80

  • 能量项链
    区间DP的标准模板
  • 虫食算
    按照运算的顺序开始搜,每填完一个数后,往后扫一遍,看看是否有明显的错误。
  • 过河
    被排序给坑死了。
    本来是一个很简单的动归,但由于范围很大,因此考虑一下特殊处理。
    不难得出这么一个结论:当 S ! = T S != T 时,最多往后走 90 90 格后,就能到达任意点(极限情况 S = 9 , T = 10 S = 9, T = 10
    因此,若两点间的距离大于 90 90 ,直接改成 90 90 即可,注意 S = = T S == T 时特盘
  • 篝火晚会
    一道神奇的结论题?(表示不会证明,貌似要扯到置换群去了)
    然而,我题意都弄错了(不一定要选择连续的)。
    求出目标的环还是挺简单的,主要是求最小的代价。
    结论:将序列 A i A_i 转化成 B i B_i 的最小代价为 A i A_i B i B_i 在对应位置上不同的个数。
    当然,仅仅靠上述的结论是不够的,由于时环形,时间复杂度为 O ( n 2 ) O(n^2)
    考虑下优化:不难发现,无论从哪里断开,与对应点间距离相同的点是不变的,也就是说,同时匹配的点是确定的。于是,直接记录距离相同点集的最大值。注意正序倒序都要来一遍。
  • 等价表达式
    思路有点奇妙,通过将 a a 赋值来简化(赋一两个就行了),将其转化为表达式求值,用求出来的数值判断即可。(考虑取模,取模的话,统一变成正数)

10.7

难得题目没看错。
整体来说还是可接受的(都做过几遍的题了)

  • 金明的预算方案
    有依赖型的背包,分类处理成分组背包即可
  • 树网的核
    两边 d f s dfs 求出最长链,尺取法扫一遍求最小值
  • 传纸条
    典型 d p dp ,跳过
  • 序关系计数问题
    第二类斯特林数的变形。允许空箱且箱子不同(本题中 n = m n = m )
    a n s = i = 1 n i ! × s [ n ] [ i ] ans = \sum_{i = 1}^{n}i! \times s[n][i]
  • 商店购物
    搜索水了点分。
    由于商品的种类不超过五,所以可以考虑转化为用五维 d p dp 。将商品的需求量看做背包(没有的视为 0 0 ),优惠方案(单价也可以算是一种)看做物品,然后做完全背包即可。

10.8

恭喜被虐(QAQ)
该错的不该错的全炸。

  • 覆盖问题
    考场上推了个诡异的记忆化,结果。。。(考场上还写错了,乘法原理果断写成了加法)
    正解其实很简单,一个格子一个格子地搜就行了,遇到空格就枚举放的方式。
  • 解集个数
    被精度给坑了,要实时地记录分子与分母( p 1 p 2 \frac{p1}{p2} )。
    最后一个分数的判定:前 n 1 n-1 个分数的和满足 p 1 + 1 = = p 2 p1+1==p2 即可
    剪枝:枚举顺序非降;若此后每个都取最大值仍小于 1 1 ,减掉;若此后每个都取最小值还大于 1 1 ,减掉。
  • 黑白棋游戏
    本来是一道很水的题,结果一发迭代加深直接炸了。
    其实只要广搜就好了。
  • 家族史图
    题目描述有点毒瘤,考场上直接略过去了。
    感觉像是一个模拟题。
    其实只要按照题目的要求判断即可,就是有点复杂。
    要点:记录入度判断儿子的合法,用弗洛伊德之类的处理父母的联通,用层数判断后代。
  • 单词游戏
    给人的感觉就是搜索,然后 T L E TLE \cdots
    n n 的范围很小,于是可以考虑用状压解决。
    有点类似与哈密顿路的解法,令 f [ s ] [ i ] f[s][i] 表示在走过状态为 s s 的边,且最后位于 i i 点后的最大复杂度。(对于单词的索引,其实可以建图)

10.9

当水题遇上水笔???最简单的两题都写挂了,,,

扫描二维码关注公众号,回复: 3620721 查看本文章
  • 小木棍
    不想说了,连最基础的剪枝都忘了,,
  • 邮票问题
    利用dp来优化枚举的范围,每层都要求一遍dp
  • 魔板
    这题还算友好不要求最小方案数(噩梦)
    首先枚举目标行的第一列与初始行的哪一列相匹配(用行变换来实现同化),至此,行就确定了下来。随后用 d f s dfs 判断其他行是否匹配就行
    (可以记录行列中 1 1 的个数来优化)
  • 方程的解数
    其实考场上的想法离正解很近了。
    正解是分成两块搜,用前一半的值匹配后一半的值;而我则考虑按照系数的正负分
    搜索很简单,只要写个 h a s h hash 和快速幂就行了
  • 算符破译
    珍爱生命,远离工业。(当然,用不着 600 600 行的,两百多就差不多了)
    最后一个点五秒多就算了(然而 b z o j bzoj 30 s e d 30sed
    调个一个下午的题,看来码力是真的不够啊。
    思路还是比较容易想的,先确定符号,再确定数字。
    剪枝:
      三重循环先枚举出符号(顺便判断可行性: = = 的唯一性,符号的位置,在符号制约下是否能填数字);
      利用位运算优化枚举(值得学习);
      边枚举数字边判断(类似虫食算)

10.10—搜索专题考试总结

这两天考的算是很渣的了。有点头痛。
  首先,做题时思路有点紊乱。无论是做过的部分题目,还是有些许思路的题。都存在接近正解却失之交臂的情况,而且有时候还是十分明显的细节;其次,是缺乏分析复杂度的能力,这也是一直以来我所欠缺的。事实上,这一点尤为重要,做题时应该要有一个整体的框架,明确题目的数据范围以及解法的复杂度范围。这样才能较快地选择较为便捷的算法,进行有效的优化。
  对于第一点而言,没什么可说的,无非就是考试时要注意。对于第二点,考虑抽时间做做相关的整理吧。


10.11

dp专题,题目难度海星,都有一点思维难度。

  • 三角形牧场
    直接求的话是不可能的,考虑用dp判断可行性,最后通过海伦公式计算求得答案。
    f [ a ] [ b ] f[a][b] 表示是否可以组成边长为 a , b , s u m a b a,b,sum-a-b 的三角形。
  • 多米诺骨牌
    记录差值,令 f [ i ] f[i] 表示差值为 i i 的最小翻转次数。
    注意 i i 可以为负数,所以统一加上一个值变为非负
  • 最长上升子序列
    由于必须要包含第 m m 个数,所以考虑以m为界,将数列分成两部分,分别求一次 L I S LIS ,然后接上即可。
    优化:在 m m 前面且数值大于 m m 的与在 m m 后面且值小于 m m 的均可忽略。
  • 修剪草坪
    考场上其实都推出来了,单调队列也写好了,然而,边界写挂了 Q A Q QAQ
    f [ i ] f[i] 表示前 i i 头牛中选取的最大效率,则
    f [ i ] = m a x ( f [ j 1 ] , s u m ( j + 1 , i ) ) f[i] = max(f[j - 1], sum(j + 1, i)) , 其中 j j 为断点且 j [ i k 1 , i ] j \in [i - k - 1, i]
    用前缀和表示: f [ i ] = m a x ( f [ j 1 ] s [ j ] ) + s [ i ] f[i] = max(f[j - 1] - s[j]) + s[i]
    考虑到数据范围,用单调队列优化即可
  • A Simple Task
    由于存在重复计算的可能,所以考场上连搜索都没有打出来(其实已经差不多可以处理重复了)。
    简单环不好表示,这里退一步,考虑表示简单路径的状态。令 f [ s ] [ i ] f[s][i] 表示经过点集为s,起点为 s s 中编号最小的点(令为 s t st ),终点为i的简单路径条数。
    转移:对于一条 u v u \to v 的边
    v s v \notin s f [ s 2 v ] [ v ] + = f [ s ] [ u ] f[s | 2^v][v] += f[s][u]
    v s v \in s v = s t v = st s s 中的点数大于 2 2 ,则 a n s + = f [ s ] [ u ] ans += f[s][u]
    注意的是,对于一个简单环而言,我们一共统计了 2 2 次,因此,最后的 a n s ans / 2 / 2

10.12

今天的题目海星,比较简单。

  • 关键子工程
    本来是能 A C AC 的,结果被在一点小细节上出现了失误( v e c t o r vector u n i q u e unique 后一定注意保存可用的长度)
    一道简单的拓扑,第二问的话,直接利用求得的 f f 数组,反着推一遍就行了
  • 编辑距离
    算是一道经典的 d p dp ,令 f [ i ] [ j ] f[i][j] 表示 a a 的前 i i 位与 b b 的前 j j 位匹配的最少操作次数。
    初始化: f [ i ] [ 0 ] = i , f [ 0 ] [ j ] = j f[i][0] = i ,f[0][j] = j
    转移: f [ i ] [ j ] = { f [ i 1 ] [ j 1 ] , a [ i ] = = b [ j ] m i n ( f [ i 1 ] [ j ] , f [ i ] [ j 1 ] , f [ i 1 ] [ j 1 ] ) + 1 , a [ i ] ! = b [ j ] f[i][j] = \begin{cases} f[i - 1][j - 1] & ,a[i] == b[j] \\[2ex] min(f[i - 1][j], f[i][j - 1],f[i - 1][j - 1]) + 1 & ,a[i] != b[j]\end{cases}
  • 硬币找零
    简单的完全背包
  • 快餐问题
    总感觉题意还是有点问题,网上一共有两种方案,均能过(但其中一种两每个生产线的时间都连在了一起。)
    这里只讲一下将时间连在一起的 d p dp
    f [ i ] [ x ] [ y ] [ z ] f[i][x][y][z] 表示前i条生产线生成**的数量分别为 x , y , z x,y,z 的套餐数。
    然后直接推就行了
  • 物品装箱问题
    简单的分组背包

10.14

好吧,考试的时候心态炸了。

  • 火车进站
    由于 m m 很小,所以可以直接分类讨论。分别做 d p dp 处理。
    注意m=2/3的时候,考虑只有1、2个同时进站的情况
  • 凸多边形的三角剖分
    区间 d p dp ,令 f [ l ] [ r ] f[l][r] 表示划分连续编号 [ l , r ] [l,r] 的最小值。
    注意拆环成链
  • 最长前缀
    貌似数据有点水,匹配的时候直接暴力 f o r for 也能过。
    f [ i ] f[i] 表示 [ 1 , i ] [1,i] 是否能匹配
  • 卡车更新问题
    初始化有点毒,被整了好久。
    方程的定义有很多,但由于要记录路径,还是选择一种容易点的吧。
    f [ i ] [ j ] f[i][j] 表示第 i i 年时当前的车用了 j j
    j = = 1 j==1 时,说明去年换了车,枚举从上一辆车用了多久,取最优值。
    否则,直接说明与去年是同一辆车,直接继承过来即可。
    记录路径的话,那就是标准的套路了.
  • 选课
    本来树型分组背包直接求就行了,然而要输出方案。
    由于路径不好记录,考虑换一种写法——转二叉树。
    利用“左儿子,右兄弟”的原则,将其转化成一棵二叉树,然后直接上几搜吧,顺便记录路径。

10.15

emmm,有点无奈啊,知道大致思路,然而总在一些细节方面出错。

  • Hankson 的趣味题
    有两种方法,既可以考虑暴力枚举 b 1 b1 的因子用 g c d gcd 判断,也可以根据唯一分解定理,限定 x x 中各个质因子次数的取值范围
  • 青蛙的烦恼
    表示数据不给面子,暴力只有 10 10
    很明显的一点,青蛙走的路径决定不能交叉,因此它只能走连续的点。
    于是按着这个思路搜索,用记搜优化即可。
    f [ l ] [ r ] f[l][r] 为以 l l 为起点,做过点集 [ l , r ] [l,r] 的最短距离
    转移如下:
IL double dfs(int l, int r)
{
	if(f[l][r] != inf) return f[l][r];
	
	if(l < r) return f[l][r] = min_(dfs(l + 1, r) + dis[l][l + 1], dfs(r, l + 1) + dis[l][r]);
	return f[l][r] = min_(dfs(l - 1, r) + dis[l][l - 1], dfs(r, l - 1) + dis[l][r]);
}
  • 警卫安排
    dp方程什么的都对了,忘了找根。。。。
    f [ u ] [ 0 / 1 / 2 ] f[u][0/1/2] :表示节点 u u 被父亲看着/被儿子看着/被自己看着。
    转移方程:
    f [ u ] [ 0 ] = v c h i l d m i n ( f [ v ] [ 1 ] , f [ v ] [ 2 ] ) f[u][0] = \sum_{v \in child}min(f[v][1],f[v][2]) : 儿子只能被自己或被儿子看着
    f [ u ] [ 1 ] = f [ u ] [ 0 ] + m a x ( 0 , m i n ( f [ v ] [ 2 ] f [ v ] [ 1 ] ) ) f[u][1] = f[u][0] + max(0, min(f[v][2] - f[v][1])) : 保证必定有一个儿子放置了看守
    f [ u ] [ 2 ] = v c h i l d m i n ( f [ v ] [ 0 ] , f [ v ] [ 1 ] , f [ v ] [ 2 ] ) f[u][2] = \sum_{v \in child}min(f[v][0],f[v][1],f[v][2]) :随意了,去最小即可。
    初始化:对于叶子节点而言, f [ u ] [ 1 ] = i n f f[u][1] = inf
  • 最短回文串
    证明未知。答案为总长度减去正反序列的 L C S LCS
  • 平板涂色
    本来想的是两维的,结果写的时候突然脑抽改成了一维,,,,,
    明显的状压 d p dp f [ s ] [ u ] f[s][u] 表示将点集 s s 中的点染上色且最后染色的点为 u u 。直接转移即可
  • xx
    J哥表示要贴成绩,那就随便吧┑( ̄Д  ̄)┍
    在这里插入图片描述

10.16

主要还是细节与实现上的问题,看来还是缺少练习。
关于

  • 硬木地板
    数据貌似有点问题。
    一道明显的状压 d p dp ,然而在状态转移的推到上还是出了点问题。一般而言,而直接枚举 + c h e c k +check 就行了,但是本题的状态有点复杂,难以直接判断,因此考虑先用 d f s dfs 求出能相互转移的状态,然后再进行 d p dp
    f [ i ] [ s ] f[i][s] 表示前 i 1 i - 1 行全满,第 i i 行状态为 s s 的方案数

  • 通向自由的钥匙
    裸的树型分组背包,然而边界还是弄错了。

  • 三角蛋糕
    忘了三角形正反都行了(还要注意奇偶性的问题),所以看漏了。
    其实这一题可以说是暴力了,只不过通过预处理来优化罢了。
    记录一下从该点出发,向下/上拓展的个数,向左/右拓展的个数。

  • 骑士
    状压 d p dp 。由于骑士的走法(日)牵扯到了上面两行,因此仅仅记录当前这一行的状态是不够的。
    f [ i ] [ k ] [ s 1 ] [ s 2 ] f[i][k][s1][s2] 表示前 i i 行共放置 k k 个骑士,第 i 1 i-1 行为 s 1 s1 ,第 i i 行为 s 2 s2 的方案数.

  • 补发
    在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/qq_27121257/article/details/82934475