目录
题目
作者: Turbo时间限制: 1S章节: 课程设计
问题描述 :
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组 可能的最大和 。
示例 1:
输入:
3
4 2 3
1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。
示例 2:
输入:
4
3 -1 0 2
3
输出:6
解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。
示例 3:
输入:
5
2 -3 -1 5 -4
2
输出:13
解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。
输入说明 :
输入三行:
第一行输入一个整数n表示数组nums的长度。
第二行输入n个整数表示数组的元素。
第三行输入一个整数表示k.
提示:
1 <= n <= 10^4
-100 <= nums[i] <= 100
1 <= k <= 10^4
输出说明 :
输出一个整数表示结果。
输入范例
4
1 2 3 4
3输出范例
8
题目分析
这道题的精髓就在于,只需要先排好序,然后每次把最小的那个变号再插入,multiset会自动排序,然后就重复把最小的那个变号再插入的过程,直到次数满足要求为止。
解答
代码
#include "bits/stdc++.h"
using namespace std;
#define MVnum 100000
#include "bits/stdc++.h"
using namespace std;
#define ll long long
class cmp{
public:
bool operator()(int a,int b){
return a>b;
}
};
int main() {
int n;
cin >> n;
multiset<int> h;
for (int i = 0; i < n; i++) {
int k;
cin >> k;
h.insert(k);
}
int times;
cin >> times;
for (int i = 0; i < times; i++) {
int tmp = -*h.begin();
h.erase(h.begin());
h.insert(tmp);
}
int sum = 0;
while (!h.empty()) {
sum += *h.begin();
h.erase(h.begin());
}
cout << sum;
return 0;
}
代码详解与难点分析(可无)
multiset的使用
给定一个整数数组nums和整数k,通过选择下标并改变符号最多k次,求可能的最大和。策略是先对数组排序,然后每次选择最小元素变号。利用multiset进行动态维护,最终得到最大和。
881

被折叠的 条评论
为什么被折叠?



