LeetCode 2412. 完成所有交易的初始最少钱数

2412. 完成所有交易的初始最少钱数

 

【贪心】假设启动资金位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;
    }
};

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值