题意:
思路:
打完哈尔滨就没写过题,这次差点被每日一题卡住咯。
题意很重要的一点就是可以多次选择同一个下标,所以用优先队列存一下所有的数,每次取最小的数变为他的相反数。
正确性简单口胡一下:
- 如果取出的数为正数,那么说明其他的数是比他还大的正数,将这个数变为负数的损失是最小的。
- 如果取出的数为负数,那么他的绝对值最大,变为正数的贡献最大。
代码:
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
int sum=0,cnt=0;
priority_queue<int,vector<int>,greater<int>>q;
for(auto tt:nums) q.push(tt);
while(k--){
int t=q.top();q.pop();
t=t*(-1);
q.push(t);
}
while(!q.empty()){
sum=sum+q.top();
q.pop();
}
return sum;
}
};