题意:
思路:
打完哈尔滨就没写过题,这次差点被每日一题卡住咯。
题意很重要的一点就是可以多次选择同一个下标,所以用优先队列存一下所有的数,每次取最小的数变为他的相反数。
正确性简单口胡一下:
如果取出的数为正数,那么说明其他的数是比他还大的正数,将这个数变为负数的损失是最小的。
如果取出的数为负数,那么他的绝对值最大,变为正数的贡献最大。
代码:
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; } };