此题是上场
l
e
e
t
c
o
d
e
leetcode
leetcode的最后一题
https://leetcode.cn/problems/find-the-k-sum-of-an-array/
#include
using namespace std;
typedef long long ll;
struct st{
int a, b;
ll sum;
bool operator < (const st &B)const{
return sum > B.sum;
}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
vector<ll> a(n + 1), b(n + 1);
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++) cin >> b[i];
priority_queue<st> q;
for(int i=1;i<=n;i++){
q.push(st{i, 1, a[i] + b[1]});
}
for(int i=1;i<=n;i++){
auto u = q.top();
q.pop();
cout << u.sum << " \n"[i == n];
q.push(st{u.a, u.b + 1, b[u.b + 1] + a[u.a]});
}
return 0;
}
typedef pair<long long, int> pli;
class Solution {
public:
long long kSum(vector<int>& a, int k) {
int n = (int)a.size();
long long ans = 0;
long long sum = 0;
long long neg = 0;
for(int i=0;i<n;i++){
sum += a[i];
if(a[i] < 0){
neg += a[i];
a[i] = -a[i];
}
}sort(a.begin(), a.end(), less<int>());
priority_queue<pli, vector<pli>, greater<pli> > q;// 小根堆
q.push(make_pair(a[0], 0));
for(int i=0;i<k-1;i++){
auto u = q.top();
q.pop();
ans = u.first;
if(u.second == n - 1) continue;
q.push(make_pair(u.first + a[u.second + 1], u.second + 1));
q.push(make_pair(u.first - a[u.second] + a[u.second + 1], u.second + 1));
}
return sum - (neg + ans);
}
};