此题看起来比较简单,但最卡人的是这个数据范围,K最多是1e9代表我们无法枚举K,但可以换一种思路,即我们一定是取1-K这K个数的,所以前面出现了哪个,我们就将边界+1,同时把前面的算好即可。
由于数组中的重复数没有用,我们排序后与上一个比较去重即可。
累加时,用分段累加就可,保证不会溢出。
typedef long long ll;
class Solution {
public:
long long minimalKSum(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int r = k;
ll ans = 0;
ll last = 1;
int last_num = -1;
for(auto num: nums)
{
if(num > r)break;
if(num == last_num)continue;
last_num = num;
r += 1;
if(num-1 >= last)ans += (num-1+last)*(num-last)/2;
last = num+1;
}
ans += (last+r)*(r-last+1)/2;
return ans;
}
};