[ABC270E] Apple Baskets on Circle Solution

更好的阅读体验戳此进入

题面

存在 n 个筐围成一圈,第 i 个有 Ai 个苹果。你需要从第 1 个筐开始依次拿掉一个苹果,直到拿了 k 个。如果筐内没有苹果那么直接拿下一个筐。求最终每个筐里还剩多少个苹果。

Solution

题解区怎么都是二分答案的做法,来一发 VP 时糊出来的更加无脑的模拟做法。

首先假设一圈里有 k 个篮子里有苹果,那么转一圈一定会拿走 k 个苹果,然后当拿空了一个篮子之后就会 kk1。所以我们考虑维护一下当前一共还有多少个篮子里有苹果,然后给所有 Ai 排个序,每次取最小的然后判断是否能拿空,如果可以的话那么直接拿空,否则尽量拿多圈,此时剩下的所有显然不足一圈,此时再次遍历一遍即可。

然后注意其中有一步 cur×v,这个东西我感觉似乎是 1024 级别的,于是开了个 __int128_t

审核没通过,说太简略了,那么就把具体过程再说一下吧:

维护一个 minus 表示当前一共拿过了多少圈,每次取一个苹果数最小的篮子并去掉已经拿走的 minus 个,然后考虑现在剩下的有苹果的篮子数,即 cur 乘上最小的剩的苹果数,如果可以全部取走那么就都取走,然后 minusminus+v。反之尽量拿更多圈,记录剩余多少个苹果没拿,显然其会小于剩余的存在苹果的篮子数,此时暴力枚举跑一下即可。

Code

UPD

update-2023_01_27 初稿

update-2023_02_01 审核没过,将叙述改的更详尽一些