SowingStones——atcoder379

第一想法是用栈来做。然后想栈和队列结合起来做,栈内保存石子数大于1的格子的下标,用于从最近的溢出格子中移动石子;队列保存格子下标,用于判断区间内的石子数量是否足够。但是这样做有点问题。如下:
有几个问题:
- 怎样一个区间一个区间地判断石子的数量是否足够?因为如果一个区间的石子不够,但如果再往前有多余的石子,也可以挪到后面。这一点有点不好操作。
- 怎样计算操作数?
去看了其他人通过的答案,感觉挺巧妙的,巧妙之处在于这种做法用一个top变量,既控制了每次小区间的右边界,最后又用它的正负判断了石子是否足够。
我能从这道题中学到什么,有没有什么可以迁移到其他问题的思路,几个启发式的方法:
- 思考个问题题的数据是否有某种内在的顺序——例如这道题,后续加入的石子,它的坐标一定是更靠后的
- 思考遍历的顺序——不一定是从小到大遍历,有时也会反向,也可能从中间向两边,从两边向中间
- 思考一个变量是否能表达更多的含义——例如它小于零的时候代表什么,大于零的时候代表什么
- 思考是否可以用整体的思路降低问题的复杂度——例如这道题如果每个存在空格的区间都判断石子是否足够的话,复杂度就过高了,而如果整体来做的话,就没那么高
- 思考有没有什么数学方法可以简化问题
1 | public class SowingStones { |