题目:
你有一些球的库存 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;
}
}