把过去和现在的笔记记录也搬了过来,也算是给以后留个念想吧,想想一开始打acm就是图一乐,后来发现这游戏还挺上头的,也算是度过了一段电竞生涯(xs)
早些时候的笔记写的好中二,连我自己看着都羞耻。
不过,就喜欢这种羞耻的感觉。
收录的题目大部分是个人认为质量不错的题目,以DP为主,非DP的题目都用※进行了标识。
当然,有些题解思路本身也是源自其他人的,不过除非特殊标注,否则都是用的自己的代码。

题目大意:

CF 1633D
Make Them Equal
题目大意:你有一个长度为n的数组a,其中每个数都为1,同时你有一个b数组,长度也为n,每个数分别为b[i],在每次操作中你可以把a数组中的一个数ai变为ai+(ai/x),x为任意整数,如果你成功让a[i]等于b[i],你将得到c[i]个硬币,现在问有k次操作最多能得到多少硬币。
b[i]<=1e3,k<=1e6

解:

这题有些巧妙的地方
B[i]<=1e3意味着我们可以通过O(n2)的复杂度通过dp求出将1变为b[i]需要多少次操作,即dp[i+i/j]=min(dp[i]+1,dp[i+i/j]),然后这个问题就变成了可以消耗k[i]次操作得到c[i]的报酬,求最大报酬,很容易发现是一个背包dp。
然而k<=1e6,你背不起,那咋办。
B[i]<=1e3啊,通过打印出dp[i]进行观察,可以发现1到1e3内需要次数最多的数也只需要12次,也就是说,实际上12000次操作足以得到所有的硬币,那么只要考虑k在12000内的情况就行,这个复杂度背包是可以接受的,复杂度为O(min(12000,k)*n)
所以说嘛,背包无论怎样也就是背包而已罢了。

代码

代码
1