解题思路:显然应该出最大值,例如序列8 5 1;一定要先把8出去,先出8 7 6,之后序列成为 5 5 1,然后两个5一起出(一次出2个)5 4 3 2,序列变成 1 1 1,三个1一起出......
排序+简单模拟,需要注意的是乘法运算很容易超出int范围导致结果不正确,坚持开longlong是一种好的习惯。
class Solution
{
public:
int maxInvestment(vector<int>& product, int limit)
{
product.push_back(0);
sort(product.begin(),product.end());
long long i,ans=0,num=1,n=product.size()-1,mod=1e9+7;
for(i=n; i>=1&&limit; i--)
{
if(limit>=num*(product[i]-product[i-1]))
{ /**< 检查能不能下降到product[i-1],运算用等差数列公式 */
ans=(ans+1LL*(product[i]-product[i-1])*(product[i-1]+1+product[i])/2%mod*num%mod)%mod;
limit-=num*(product[i]-product[i-1]);
num++;
}
else
{
int x=limit/num,y=limit%num;
ans=(ans+1LL*x*(product[i]-x+1+product[i])/2%mod*num%mod)%mod;
ans=(ans+1LL*(product[i]-x)*y)%mod;
limit=0;
}
}
return ans;
}
};