活跃农民
- 积分
- 441
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2013-3-14
- 最后登录
- 1970-1-1
|
本帖最后由 14417335 于 2019-2-22 07:33 编辑
开始找到了一点刚开始刷leetcode时候的感觉,各种不会。。看到题目各种懵逼,看完答案深深为自己智商感到绝望。。
POJ 2393: Yogurt factory
N周,每周需要生产Ai unit的奶酪,每周的生产成本为 Ci, 注意价格会上下浮动。多生产的奶酪可以存储,存储费用为 S, 求总的最少生产费用
思路:很显然,第j周的奶酪的最小生产费用是 Cj + (j-i)*S, for all i <= j. 看上去似乎我们需要写一个 O(N^2) 的算法来解决,不过仔细考虑,设第i周的最小生产费用是 min_price, 不管这个min_price是怎么来的,那么第i+1周的最小生产费用肯定是 min(min_price + S, C[i+1]), 因此只要不停更新最小生产费用就可以做到 O(N) 时间 O(1) 空间了。
要点:
1. 如果第j天的情况依赖于1 -> j-1天的情况,下意识的想到可否把前面的计算结果保存下来,免得重复计算
2. 这题已经提示了说结果可能 int 装不下,仔细看题目啊!!
POJ 1017: Packets
一共有6种大小的正方形瓷砖,边长从1到6。分别给出这6种瓷砖的数量。工厂要把他们装在 6*6 的包装袋中。问最少需要的包装袋数、
思路做这题的时候感受到了智商天花板。很明显这题应该先放边长是6,5,4,3的,剩下的看看还需要多少包装袋放2,1。但是我只会从正面去考虑这个问题,也就是想装4的包装袋还能装多少2, 然后完了还剩下多少2, 然后再考虑装3的包装袋。。太愚蠢了!
实际的做法是直接计算4,3可以装多少2,然后比较一下看看是否还需要更多的包装袋来装2.然后下面是不是还需要遍历各种条件来看看能否装1呢?不用!直接计算剩下来的面积就可以!(共计包装袋数量 * 36 - cnt_6 * 36 - cnt_5 * 25...)
POJ 3040: Allowance
农夫有N种硬币,每种硬币都有相应的个数和币值。需要用这些硬币去付款,每周需要最少付款C元,求最多付款周数
思路:好难。。。想了N个小时最后还是看的题解。。看了好久才看懂。贪心的策略很快就能想到就是先从大往小取,可是我一直没想清楚的是如果不能刚好凑满C元的处理方法。后来看了答案才发现解题核心是由两个贪心策略构成的:
1- 首先从大到小取硬币,但是不能超,这样保证我们尽快接近C
2- 如果还有剩余的,这意味着我们任意再取一枚硬币就会超了(想一想为什么?),这种情况下我们为了避免浪费取最小的
3- 重复以上过程,直到步骤2结束后剩余硬币价值依然 > 0
还有一个精妙的优化,就是1, 2完后我们记录下每种硬币的需要的个数 cnt, 最后我们可以直接用 min(coins_value[ i ] / cnt[ i ])来计算相同的取法有多少种(例如题目给的例子,5, 1的取法可以取100种,我们一次遍历就够了)。
POJ 1862: Stripies
N个微生物,两两结合后体重会变成 sqrt(m1*m2), 求最后结合完的最小体重
思路:做完上面那题再做这题简直如沐春风。越先结合的sqrt的次数越多,因此显然应该尽量先结合大的微生物。纯粹的模板题目。虽然很快敲完了但是也没什么思考的快感了。。
POJ 3262: Protecting the flowers
N个奶牛,每个奶牛带回去时间来回需要Ti, 每个奶牛单位时间内摧毁Di朵花, 决定奶牛带回顺序使得被摧毁的花的总数最小。
思路: 在需要决定整体顺序的时候,我们只两两考虑。面对奶牛i和奶牛j,怎么决定先带回哪一个呢?这取决于Ti*Dj以及Tj*Di的大小。因此我们根据这个compare rule对整个奶牛进行排序,然后挨个带回去就好了。
一种比较naive的思路是先带破坏力高的奶牛,稍加思考可发现这个思路是不对的。比如 (1, 1), (4, 2), 先带奶牛2导致总共有4朵花被破坏,反之则只有1个。通过这个例子我们也应该能领悟到这题排序的准则。
|
|