1111 AlvinZH的序列问题 思路 中等题,动态规划. 简化题意,. 坑点一:二维int数组MLE,明显会超过内存限制,由于\(n\)最大为1e4,那么我们的dp数组最大也是1e4,考虑使用short int. 坑点而:被题目开始的子序列描述误导,题目没有要求等差数列中数字顺序和输入顺序一致,所以可以先将数组排序. dp[i][j]:以A[i].A[j]开头的等差数列(可保证i<j).初始化值为2. 状态转移:固定j,i与k分别向两边扩展,当2*A[j]=A[i]+A[k]时,说明A[i]…
1083 AlvinZH的青春记忆III 思路 难题,二分图. 说这是一个考察二分图的题目,你可以会说"不可能",这哪里像一个二分图了!这真的是一个二分图,考察的是最小顶点覆盖. 你不知道最小顶点覆盖没有关系,别百度,先慢慢分析,别先入为主. 简化题意.A.B两列数字,若B[i]%A[j]==0,则二者需要去掉一个.问一共最少需要去掉多少人! 错误方法:二重循环记录可以整除的双方编号B[i]和A[j],记M1[A[j]]=M2[B[i]]=true,之后求M1.M2中为true的数量,…
1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定义为可以交战,若 Ai==Bj,则 Ai 可与 Bj 交战,之后下一场 Aii.Bjj 交战的条件是:Aii==Bjj.ii>i.jj>j.Aii>Ai.Bjj>Bj . 这是什么呢?最长公共子序列?最长递增子序列?都很像,其实是最长公共递增子序列!最长公共子序列与最长递增子序列的叠加…
1083 AlvinZH的青春记忆I 思路 中等题,动态规划. 简化题意,一个环上取数,数不可相邻,取取得数之和最大值. 环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者. ①:取第一个点,可取得最大价值为宝物[1,n-1]的最大价值. ②:不取第一个点,可取得最大价值为宝物[2,n]的最大价值. 动态规划,状态转移方程:\(dp[i] = max(dp[i-1], dp[i - 2] + V[i])\) 分析 时间复杂度:\(O(n)\). 参考代码 // // Created…
1084 AlvinZH的青春记忆II 思路 中等题,二分. 简化题意,一列数字,每秒会自动-1,特殊操作可以使一个数在1s内-k,问这些数都减至0需要多久. 答案肯定在[1,xMax]之间,采用二分的方法找到最小时间. 如何判断一个时间值是否符合要求呢?对于≤mid的数,自然消减就好,对于>mid的数,需要特殊操作,设特殊操作次数为s,则有 \(k*s + (mid-s) = Xi\),解得 \(s = (X[i]-mid) / (k-1)\). 分析 注意三个问题, 第一,除0问题,k-1可…
1063 wuli51和京导的毕业旅行 思路 中等题,二分+贪心. 简化题意,将m+1个数字分成n份,ans为这n段中每段数字和的最大值,求ans最小值及其方案. 对于这种求最小的最大值,最常用的方法是二分.答案一定在[0,sum]之间,通过判断是否符合要求可以求得ans.在本题中,ans一定是整数,所以二分过程中left.mid.right也是整数. 如何判断是否符合要求?对于某一mid值,遍历一次露营地距离数组,通过贪心,总是使一天内的行程尽可能接近mid,但不可超过mid.若是加上某一露营…
1119 AlvinZH's Fight with DDLs III 思路 难题,最小点覆盖. 分析题意,某一个任务,既可以在笔记本A的 \(a\) 模式下完成,也可以在笔记本B的 \(b\) 模式下完成.如果笔记本A处于x模式,那么所有可以在笔记本x模式的任务可以一起完成,B同理.这两句话作为题目核心,该如何转化呢? 对于每个任务对应的(a,b),我们把它映射到平面坐标当中,明显发现,此题和二营长,你他娘的意大利炮呢简直一模一样.其实就是一个最小点覆盖问题,也就是最大二分图匹配问题. 关于最小…
1117 AlvinZH's Fight with DDLs I 思路 简单题,动态规划. 本题与期末练习赛B题很相似,而且更为简单些.简化问题:在数字序列上取数,不能取相邻的数. DP数组定义,dp[i]:到达第i层所能取得的最大经验值.初始化:dp[0] = x[0], dp[1] = max(x[0], x[1]). 对于第 \(i\) 层,有两种选择:不打,等于 \(dp[i-1]\):打,等于 \(dp[i-2] + x[i]\).二者取最大值即可. 状态转移方程:\(dp[i] =…
1118 AlvinZH's Fight with DDLs II 思路 中等题,贪心. 理解题意,每次攻击中,可以使某个敌人生命值-1,自己生命值减去∑存活敌人总攻击力. 贪心思想,血量少攻击高的要先消灭,所以以A/L作为参数排序,即将所有的敌人根据A/L从大到小排序. 遍历一次,对于排序好的敌人,HP减去(总攻击*该敌人血量),总攻击减去该敌人攻击.代码如下: HP -= (sumA * H[i].L); sumA -= H[i].A; if(HP <= 0) break; 分析 贪心证明:…
862-AlvinZH的儿时梦想--运动员篇 思路 难题. 应该想到,不管给出的数据如何,每一个淘汰的人不会对最终答案产生任何影响,所以每次淘汰就把人除掉就可以了,最后剩下的两个人计算它们从开始到相遇需要的时间就可以了. 首先对每个人根据初始位置进行排序,因为相遇总是先发生在相邻的两个人身上的,所以一开始先对相邻的人两两计算相遇时间,然后把相遇时间放进优先队列里(保证时间短的优先出队),然后依次出队,判定见面的两个人中哪个会被淘汰,然后把淘汰的人除去,维护新建立起来的相邻关系,以及新的相遇时间放…
1124 ModricWang's Fight with DDLs I 思路 这道题本质上就是一个多项式求值,题目中的n需要手动算一下,单位复根可以根据复数的性质来求,即\(e^{i\pi}+1=0\),对指数\(i\pi\)进行乘除就能得到各个单位复根,带进多项式即可得到答案.需要注意的是,这里的函数次数k很小,因此时间复杂度为\(O(k^2)\) 的朴素算法是完全没有问题的.如果k大一些,就可以使用FFT了,这个题的题面在做的其实就是求一次FFT.希望通过这一个题帮助大家巩固一下FFT的定义…
872 AlvinZH的儿时梦想----坦克篇 思路 简单题.仔细看题,题目意在找到直线穿过的矩形数最小,不能从两边穿过.那么我们只要知道每一行矩形之间的空隙位置就可以了. 如果这里用二维数组记住每一个空隙的位置,一是没有必要,二是记录了还要大量的处理才能得到答案.反正我是没想过要怎么处理. 可以发现,要得到本题的答案,只要找到空隙最多的哪个位置,我们取左边参考点,每一行的空隙位置我们可以记录到同一个数组里,即用A[pos]代表pos位置的直线有多少个空隙.但是发现总长度有点大,用数组是不可能了…
1126 ModricWang's Fight with DDLs III 思路 由于题目中已经说明了时间经过了正无穷,因此初始位置是不重要的,并且每条边.每个点的地位是均等的.因此到达每个点的概率就是这个点的度数+1(可以停留就等于是有一条连向自己的边),最后的概率就是 \[\frac{\sum S中的点的度数}{\sum 所有点的度数}\] 时间复杂度\(O(m)\),空间复杂度\(O(m)\) 代码 #include <iostream> #include <set> #in…
中等·Bamboo's Fight with DDLs II 分析 一句话:给定字符串,求最长回文子序列长度,动态规划LCS思想的进阶应用 具体思路如下: 对于任意字符串,如果头尾字符相同,那么字符串的最长回文子序列等于去掉首尾的字符串的最长子序列加上首尾:如果首尾字符不同,则最长回文子序列等于去掉头的字符串的最长回文子序列和去掉尾的字符串的最长回文子序列的较大者. 因此动态规划的状态转移方程为: 设字符串为str,长度为n,dp[i][j]表示第i到第j个字符间的回文子序列的最大长度(i<=j…
1125 ModricWang's Fight with DDLs II 思路 圆内被划分部分数的计算方式如下: 圆内部的每一个交点都使得总份数增加了一:除此之外,每一根直线段最后抵达圆周时,总份数也增加了一. 因此: 总份数应该是 \(1+圆内部的交点数量+直线段的数量\) 直线段的数量等于 \(C_n^2\) 交点数量的求法需要一些思维量.可以把圆内部的每个交点看成是某个圆内接四边形的对角线交点,于是在n个点中,任意四个点的组合都对应了圆内部的某个交点.因此,交点数量等于 \(C_n^4\)…
简单·Bamboo's Fight with DDLs III 分析 一句话:贪心,简单哈夫曼应用,要求的其实是所有结点的值与权值的乘积之和,也就是带权路径长. 可以理解为非叶子节点的权值的和,这里的权值就是零食个数 样例分析: 1 2 3 --- 1 2->3 3 3->6 3+6=9 所以得到6的同学是没有最后相加 因为只需要求最后的结果,不需要建树,可以用优先队列实现,每次挑权值最小的两个相加,将生成的新的结点进入到优先队列中,每次都要将pop的结点的权值加入ans中,直到队列为空 博客…
简单·Bamboo's Fight with DDLs I 分析 一句话:要装满的完全背包问题. 对比完全背包只有一点要改变:初始化为负无穷 传送门: https://buaacoding.cn/problem/101/index 装满的01背包,有何不同大家自己思考 代码样例 #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std;…
864 AlvinZH的儿时回忆----蛙声一片 题目链接:https://buaacoding.cn/problem/865/index 思路 中等题.难点在于理解题意!仔细读题才能弄懂题目规则.整个过程是通过模拟位置变化进行的. 第一个问题是AlvinZH的情绪变化,忽略某一位置的青蛙条件是:刚刚经历失败,即前一位置没有抓到青蛙. 第二个问题是什么情况抓到青蛙:不灰心的情况遇到多只青蛙,除去跳的最远的青蛙(可能多只),剩下的都被抓. 分析 像这种数据循环利用且不断变化,但是有序的数据集,应该…
864 AlvinZH的儿时回忆----跳房子 题目链接:https://buaacoding.cn/problem/864/index 思路 这是一道简单题,但是同样有人想复杂了,DP?大模拟?. 本题只要判断能不能到达最后一个格子,又没有问方法数.所以,只需要一个单变量rightMost记录最远能到达的地方,遍历一次数组后比较其与n的大小即可. 分析 经典染色问题的转化:可以把跳格子的过程看成是染色,设在某一时刻,index=m的位置已经被染色了,那么 index=n (n<=m) 的位置肯…
864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起所有机器的消耗.即比较 \(\sum_{i=1}^{n}a_i\) 与 \(p\) 的大小. 分析 本题有两种解法. 方法一:二分. 即二分枚举最长时间,判断充电器能否支撑此时间所有的耗能,不断缩小时间范围,最后可求得答案.难点在判断函数,比较在当前时间条件下,所有需要充电的机器需要的能量能量总和与…
1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那么这两个凸包(凸多边形)一定是不相交的. 计算凸包一般有两种方法,Graham扫描法和Jarvis步进法. Graham扫描法比较简单,好理解,书中也有伪代码.先找到最左下点P0,对剩下的点相对P0进行极角排序.然后依次进栈判断.当算法终止时,栈中从底部到顶部,依次是按逆时针方向排列的凸包中的点(有…
1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的两个随从间连上边,这样就把问题转化为图了. 需要注意的是属性值的转化:免疫可看做生命值无限,剧毒可看做攻击力无限.(需要一点小小的机智) 图建好了,接下来怎么办呢?假设存在一种方案满足题意,那就是每个我方随从都可以找到敌方随从攻击,由于要团灭,只能存在一对一的情况,不存在多对一或一对多.如何表达这个…
940 AlvinZH的最"长"公共子序列 思路 DP,难题. \(dp[i][j]\) :记录A的前i个字符与B的前j个字符变成相同需要的最小操作数. 初始化:dp[i][0] = i, dp[0][i] = i.分别代表i次删除or添加操作. 三种操作得到dp[i][j],取其中最小值: 替换:可能不需要替换,所以是dp[i-1][j-1]+Same(A[i-1],B[j-1]): 删除:dp[i-1][j]+1: 添加:dp[i][j-1]+1. 千万不要纠结操作的序列是A还是B…
978 AlvinZH的1021实验plus 思路 贪心,中等题. 使用miss变量表示未覆盖的最小数字,初始值为1. 初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m. 需要比较miss和数组里没有使用的数字中最小的数字x(所以需要先给数组排序. miss更小:没有一个组合可以满足需要的值,需要插入该值,即插入miss,这时覆盖区间变成 \([1,miss<<1)\) . miss更大:当前可以覆盖[1,miss),加上此值,覆盖区间变为 \([1,miss+x)\…
905 AlvinZH的奇幻猜想--三次方 思路 中等题.题意简单,题目说得简单,把一个数分成多个立方数的和,问最小立方数个数. 脑子转得快的马上想到贪心,从最近的三次方数往下减,反正有1^3在最后撑着保证减完.不好意思这是错的,因为1,27,64,125...等立方数之间并不是倍数关系,不能构成贪心策略.举个反例:96=64+8+8+8+8=64+27+1+1+1+1+1,答案明显是5,而贪心会算到7. 既然不是贪心,那就是DP了,没毛病.先讲一下常规做法吧,是这样想的:相当于把一个数化成几份…
870 斐波那契进阶 题目链接:https://buaacoding.cn/problem/870/index 思路 通过读题就可以发现这不是一般的求斐波那契数列,所以用数组存下所有的答案是不现实的.题目也明确点明此题可以利用矩阵的计算解题. 如果你稍微百度一下你会了解到快速矩阵幂的概念. 什么是快速矩阵幂? 分析 快速矩阵幂算法是一种简单的具有典型意义的连续为离散算法,同学们一定要掌握其思想,而不是从网上copy一份板子就用. 时间复杂度:\(O(lgN)\): 考点:简单的快速矩阵幂: 坑点…
1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × OB = x1y2 - x2y1. OA × OB > 0:OA在OB的顺时针180°内: OA × OB = 0:三点共线,方向不一定相同: OA × OB < 0:OA在OB的逆时针180°内. 分析 注意数据范围,建议使用double.long long还是少用些好,真的. 参考代码 #in…
1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时curTime大于此课程DDL,表示无法学习此课程,但是我们不减去此课程,而是减去用时最长的那门课程(优先队列队首,课时最长). 贪心: 假设当前课程为B,被替换课程为A,则有A.d≥B.d,A.e≤B.e.既然curTime+A.d≤A.e,那么curTime+B.d≤B.e绝对成立,保证了B的合法性…
850 AlvinZH的学霸养成记III 思路 难题.概率DP. 第一种思考方式:直接DP dp[i]:从已经有i个学霸到所有人变成学霸的期望. 那么答案为dp[1],需要从后往前逆推.对于某一天,有可能会增加一个学霸or不增加. ①增加:\((dp[i+1] + 1) * P\) ②不增加:\((dp[i] + 1) * (1-P)\) 其中,\(P = i * (n - i) * p / (C(n,2))\),C(n,2) = (n - 1) * n / 2.其含义是:n个人中选出一非学霸一…
975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题变成了表示(n-Wi),可递归,可循环.见看考代码一. 本题亦可联想到三进制,思路清奇.可以参考段柯宇同学的题解. 分析 简单讲讲为什么,贪心在哪里.令W[6]={1,3,9,27,81,243}表示砝码重量,Sum[6] = {1,4,13,40,121,364}表示前i个砝码总和. 可以发现W[…