题目:
题解:
思路:贪心 + 一次遍历
- 这种题硬想的话很难,只能记住这种套路,方便下次遇到类似题想起思路来。
白话解释:
代码如下:
using LL = long long;
class Solution {
public:
// 这里要求是任意一种,所以我们要让结果尽量差,能满足所有的情况。因此我们需要先亏钱,再赚钱
// 亏完钱之后,如何让初始的钱数最大呢?当 cost < cashback 时表示在赚钱;当 cost > cashback 时表示在亏钱
// 1)亏完钱之后,找一个赚钱里面 cost 最大的,即 max(cost)
// 2)亏完钱之后,找一个最后一次亏钱的,由于此时的 total_lose 已经记录亏钱了,需要减去 cost-cashback,然后再加上 cost,为 total_lose - (cost-cashback) + cost = total_lose + cashback
// 因此我们就需要在 1 2 中取 min,赚钱时 cost 小,取 cost;亏钱时 cashback 小,取 cashback。因此我们只用取 cost 和 cashback 中的较小值了,然后保留一个最大的二者之一了。
long long minimumMoney(vector<vector<int>>& q) {
LL mx=0,total_lose=0;
for(auto& it:q)
{
total_lose+=max(0,it[0]-it[1]);
mx=max(mx,1LL*min(it[0],it[1]));
}
return total_lose+mx;
}
};