题意
有一袋球,分别有每个颜色若干个,取orders个球。
每个球的,价值是剩余球的数量。求最大值。
思路
扫描线+贪心
代码
class Solution {
public:
long solve(long a, long b)
{
long mod = 1000000007L;
if (a & 1)
return b / 2 * a % mod;
return a / 2 * b % mod;
}
int maxProfit(vector<int>& inventory, int orders) {
sort(inventory.begin(), inventory.end());
long sum = 0;
long mod = 1000000007L;
int index = inventory.size() - 1;
while (index - 1 >= 0 && orders > 0)
{
long l = inventory[index - 1];
long r = inventory[index];
long width = inventory.size() - index;
long nums = (r - l) * width;
if (nums <= orders)
{
sum += solve(r + l + 1, r - l) * width;
sum %= mod;
orders -= nums;
}
else
{
long x = orders / width;
long y = orders % width;
sum += solve(r + r - x + 1, x) * width;
sum %= mod;
sum += y * (r - x);
sum %= mod;
orders = 0;
}
index --;
cout << sum << endl;
}
if (orders > 0)
{
long x = orders / inventory.size();
long y = orders % inventory.size();
sum += solve(inventory[0] * 2 - x + 1, x) * inventory.size();
sum %= mod;
sum += y * (inventory[0] - x);
sum %= mod;
}
return sum;
}
};