【Java】Leetcode1648 销售价值减少的颜色球

题目:

你有一些球的库存 inventory ,里面包含着不同颜色的球。一个顾客想要 任意颜色 总数为 orders 的球。

这位顾客有一种特殊的方式衡量球的价值:每个球的价值是目前剩下的 同色球 的数目。比方说还剩下 6 个黄球,那么顾客买第一个黄球的时候该黄球的价值为 6 。这笔交易以后,只剩下 5 个黄球了,所以下一个黄球的价值为 5 (也就是球的价值随着顾客购买同色球是递减的)

给你整数数组 inventory ,其中 inventory[i] 表示第 i 种颜色球一开始的数目。同时给你整数 orders ,表示顾客总共想买的球数目。你可以按照 任意顺序 卖球。

请你返回卖了 orders 个球以后 最大 总价值之和。由于答案可能会很大,请你返回答案对 109 + 7 取余数 的结果。

输入:inventory = [2,5], orders = 4
输出:14
解释:卖 1 个第一种颜色的球(价值为 2 ),卖 3 个第二种颜色的球(价值为 5 + 4 + 3)。
最大总和为 2 + 5 + 4 + 3 = 14 。

思路:

从小到大排列数组,再从最大的往前计算,看与之前的差值是否够到 orders

题目本身不难,记录一下如何正确的取余

思路是之前的数据用 long 存储,在最后取余转 int 输出。

class Solution {
    public static int maxProfit(int[] inventory, int orders) {
        int mod = 1000000007;
        Arrays.sort(inventory);
        int len = inventory.length;
        int count = 1;
        long res = 0;
        for(int i=len-1;i>=0;i--){
            int num = i==0?inventory[i]*count:(inventory[i]-inventory[i-1])*count;
            if(num>orders){
                long c1 = orders/count;
                long c2 = orders%count;
                res += sum(inventory[i],inventory[i]-c1)*count;
                res += (inventory[i]-c1)*c2;
                break;
            }else{
                orders-=num;
                if(i==0){
                    res += sum(inventory[i],0)*count;
                }else{
                    res += sum(inventory[i],inventory[i-1])*count;
                }
            }
            count++;
        }

        return (int)(res%mod);
    }

    public static long sum(long h,long l){

        return h*(h+1)/2-(l*(l+1))/2;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值