864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起所有机器的消耗.即比较 \(\sum_{i=1}^{n}a_i\) 与 \(p\) 的大小. 分析 本题有两种解法. 方法一:二分. 即二分枚举最长时间,判断充电器能否支撑此时间所有的耗能,不断缩小时间范围,最后可求得答案.难点在判断函数,比较在当前时间条件下,所有需要充电的机器需要的能量能量总和与…
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) 的位置肯…
870 斐波那契进阶 题目链接:https://buaacoding.cn/problem/870/index 思路 通过读题就可以发现这不是一般的求斐波那契数列,所以用数组存下所有的答案是不现实的.题目也明确点明此题可以利用矩阵的计算解题. 如果你稍微百度一下你会了解到快速矩阵幂的概念. 什么是快速矩阵幂? 分析 快速矩阵幂算法是一种简单的具有典型意义的连续为离散算法,同学们一定要掌握其思想,而不是从网上copy一份板子就用. 时间复杂度:\(O(lgN)\): 考点:简单的快速矩阵幂: 坑点…
858 群鸦的盛宴 题目链接:https://buaacoding.cn/problem/858/index 思路 本题乍一眼看过去,你可能会想到使用一个二维数组A[51][51]来记录从i到j的路线数. 你很厉害,这是DP的思想.可是什么情况才用DP:分解得到子问题往往不是互相独立的.这也是DP和分治的最大区别之一.这题我从a走到b,和a之前b之后的格子完全没有关系啊! so,冷静一下再看看,你会发现从1走到3和从2走到4其实是一样的,然后你会发现答案只与\(b-a\)有关. 举几个例子吧,1…
朴素的中位数 题目链接:https://buaacoding.cn/problem/846/index 分析 题意很简单,就是给定了两个从小到大排好序的数组,找出这两个数组合起来的数据中的中位数. 方法应该比较多,很容易想的比如直接合并成两个数组然后对大数组sort()排序:又因为两个数组都已经是各自有序的了,可以联想一下归并排序中合并数组的方式直接得到有序的大数组,这样会快很多(这也是出这道题的本意):应该也可以用找第k小数的方法利用快排的方式直接找中位数.当然因为没有太卡时间,所以方法随意.…
872 AlvinZH的儿时梦想----坦克篇 思路 简单题.仔细看题,题目意在找到直线穿过的矩形数最小,不能从两边穿过.那么我们只要知道每一行矩形之间的空隙位置就可以了. 如果这里用二维数组记住每一个空隙的位置,一是没有必要,二是记录了还要大量的处理才能得到答案.反正我是没想过要怎么处理. 可以发现,要得到本题的答案,只要找到空隙最多的哪个位置,我们取左边参考点,每一行的空隙位置我们可以记录到同一个数组里,即用A[pos]代表pos位置的直线有多少个空隙.但是发现总长度有点大,用数组是不可能了…
862-AlvinZH的儿时梦想--运动员篇 思路 难题. 应该想到,不管给出的数据如何,每一个淘汰的人不会对最终答案产生任何影响,所以每次淘汰就把人除掉就可以了,最后剩下的两个人计算它们从开始到相遇需要的时间就可以了. 首先对每个人根据初始位置进行排序,因为相遇总是先发生在相邻的两个人身上的,所以一开始先对相邻的人两两计算相遇时间,然后把相遇时间放进优先队列里(保证时间短的优先出队),然后依次出队,判定见面的两个人中哪个会被淘汰,然后把淘汰的人除去,维护新建立起来的相邻关系,以及新的相遇时间放…
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; 分析 贪心证明:…
1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定义为可以交战,若 Ai==Bj,则 Ai 可与 Bj 交战,之后下一场 Aii.Bjj 交战的条件是:Aii==Bjj.ii>i.jj>j.Aii>Ai.Bjj>Bj . 这是什么呢?最长公共子序列?最长递增子序列?都很像,其实是最长公共递增子序列!最长公共子序列与最长递增子序列的叠加…