分糖果
暴力做法(90 pts)
枚举 [L, R] 中的每个糖果总数,将糖果总数依次 % n,则为奖励的糖果数,在奖励中取最大的数字就是答案。
数学规律(100pts)
直到篮子里的糖数量少于 n 块。此时篮子里剩余的糖果均归你所有。
观察样例,发现,在某些情况下,最多的奖励就是 n - 1 块糖果。
关键分类:区间 [L, R] 够不够覆盖一整轮余数?
情况1:R−L≥n−1(区间横跨了一整个周期)
答案 = n - 1
情况2:R−L<n−1
答案 = r % n
小熊的果篮
暴力做法(70 - 80 pts)
维护一个数组存“还活着,没被挑走”的水果。每轮扫一遍,块首取走,其余保留。
每轮都要扫描整个数组,最坏情况下需要跑 n 轮,每轮遍历 n 个水果。
正解1(结构体链表)
由于朴素做法每次扫描数组都需要O(n)的时间开销,所以考虑用结构体链表存储每个块的存活情况。
正解2(set + 数学规律)
由于水果只有两个类型,把苹果和橘子放进两个 set 中。
取不同的水果的块首 = 交替从 s1 和 s2 中取数字,且从 s1 取完后,下一次从 s2 中取时,一定要取比 s1 水果编号更大的数字。
纪念品
观察到:题目主要是围绕每天用金币购买纪念品,然后卖出,获取最大金币的问题。本质是一个资源交换的问题,所以考虑:背包DP。
状态: dp[v] :金币为 v 时的最大纪念品个数。
状态转移方程:每天考虑怎么购买能获得最大利润。