CF1165F1 Microtransactions (easy version) 题解
解题思路
很容易知道,买完所有东西的最小花费是 $\sum_i^n k_i$,最大花费是 $\sum_i^n (k_i\times 2)$,所以,我们可以得出,买完所有物品的最小天数是 $\sum_i^n k_i$,最大天数是 $\sum_i^n (k_i\times 2)$,因此,我们只需要在这个区间内求出一个能够买完所有物品的最小天数。
随着时间的增长,能够买到的物品的数量也会增长,即在 $t_i$ 天内能够买到所有物品,那么在 $t_{i+1}$ 天之内肯定能够买到所有的物品。显然,暴力枚举区间 $[ \sum_i^n k_i,\sum_i^n (k_i\times 2) ]$ 会超时,那么我们可以考虑二分答案来求得最小天数,即,每次找到区间 $[l,r]$ 的中点 $mid$,判断在这个天数的时候能否买到所有的物品,如果能,继续查找区间 $[l,mid - 1]$;如果不能,查找区间 $(mid,r]$。
对于二分答案中的 Check 函数(判断当前决策是否可行的函数),我们可以知道,当前的钱数 $M$ 等于天数 $T$,那么我们找到从第一天到第 $T$ 天中的每一个打折的日期,然后判断一下,当前的钱数能否把这个物品买完,如果不能,就买一部分;如果能,那么判断钱是否有剩余,如果有的话,就加入剩余的钱的数量 $RM$ 中。当我们判断完打折天数后,我们还需要判断当前剩余的钱能不能够买得到剩余的在打折的时候没有买的物品,如果不能,返回 false,能得话,返回 true。
以上是本题的思路,代码就不贴了。

浙公网安备 33010602011771号