【贪心】假设启动资金位money。
那么money >=(a0 - b0) + (a1 - b1) + (a2 - b2) + ...(ai-1 - bi-1) + ai,也就是最后一个的我们可以不考虑他的cashback,如果我们以这个来枚举的话,ai这一项就固定了,再看前面,为了使得money最大,我们把a - b < 0(也就是不亏损的)都不要,相当于把他们都放在了ai的后面。
换句话来说,对于某一项投资来说,他之前剩下的最少的钱就是把所有除了他之外亏损的都亏了。这样的话枚举每一项投资,求money的最大值就行了。
具体地,先求出所有的总和,遍历投资项目的过程中,如果当前也是亏损的,就先从总的里面抠出去,然后再加上他的消耗。其他的就在总和基础上加上消耗就行了。
class Solution {
// 贪心
// money >= (b0-a0) + (b1 - a1) + ... + (bi-1 - ai-1) + ai
public long minimumMoney(int[][] transactions) {
long ans = 0L;
long sum = 0L;
for (var t: transactions) {
if (t[0] > t[1]) sum += t[0] - t[1];
}
for (var t: transactions) {
if (t[0] > t[1]) ans = Math.max(sum - (t[0] - t[1]) + t[0], ans) ;
else ans = Math.max(sum + t[0], ans);
}
return ans;
}
}
class Solution {
public:
// 贪心+前缀和
// 9:48
long long minimumMoney(vector<vector<int>>& transactions) {
long sum = 0;
for (auto t: transactions) {
if (t[0] - t[1] > 0) sum += t[0] - t[1];
}
long ans = 0;
for (auto t: transactions) {
if (t[0] - t[1] > 0) ans = max(ans, sum - (t[0] - t[1]) + t[0]);
else ans = max(ans, sum + t[0]);
}
return ans;
}
};