感想
这题真是绝了,A了好久都A不出来.一直在纠结数值溢出的问题,最后索性全用long long了,我就不信还能溢出了.
既然写了这么久,还是写个博客纪念一下吧.
整体思路就是排序加二分搜索.排序很简单,略过不表.二分搜索是为了找到一个边界值,它将数组一分为二,大于此值的数值是都要取的;等于此值的数值选择性选取,能凑够需要的球数即可.这样就得到了最大值.
代码
class Solution {
private:
int constant = 1000000000+7;
public:
long long calc(long long n, long long k)
{
return (n*(n+1)/2 - k*(k+1)/2)%constant;
}
int maxProfit(vector<int>& inventory, int orders) {
sort(inventory.begin(),inventory.end());
int max = inventory.back(); int min = 0;
long long result = 0, k = max >> 1;
long long temp = 0;
long long count = 0;
while(1)
{
for(int i = inventory.size()-1; i >= 0; --i)
{
if(inventory[i] >= k)
{
count++;
temp += inventory[i] - k;
}
}
if(temp == orders) break;
else if(temp > orders)
{
min = k;
k = (k+max) >> 1;
count = 0;
temp = 0;
}
else if(orders - temp <= count)
{
result += (orders-temp) * k % constant;
break;
}
else
{
max = k;
k = (k+min) >> 1;
count = 0;
temp = 0;
}
}
for(int i = inventory.size()-1; i >= 0; --i)
{
if(inventory[i] > k)
{
result += calc(inventory[i], k);
result %= constant;
}
else
{
break;
}
}
return result;
}
};