第一题 3974. K 个元素的最大总和
- 题解
按从大到小依次选k个元素,判断mul的正负决定累加时是否乘以mul,mul减一。
其中,数组长度为10^5所以每次去最大元素用暴暴力遍历会超,我这里用大跟堆实现。下面给出小跟堆代码。
C++
void up(int i, vector<int> & a) {
int t = i >> 1;
if (!t) return;
if (a[t] < a[i]) {
swap(a[t], a[i]);
up(t, a);
}
}
void down(int i, int n, vector<int>& a) {
int l = i * 2;
int r = i * 2 + 1;
if (r < n) {
int k = r;
if (a[l] > a[r]) {
k = l;
}
if (a[i] < a[k]) {
swap(a[i],a[k]);
down(k, n, a);
}
}
}else if (l < n) {
if (a[i] < a[l]) {
swap(a[i], a[l]);
down(l, n, a);
}
}
}
第二题