比赛的时候一直没有想出来,一直在关注复杂度,哭哭~
思路:
用大根堆动态维护n个最小值,每当判断是否加入某个值时,与堆顶元素比较,若小于堆顶元素,删除堆顶元素,加入该值。
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max_n=1e5+10;
int n;
int a[Max_n],b[Max_n];
int tmp[Max_n];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int j=0;j<n;j++)scanf("%d",&b[j]);
sort(a,a+n);
sort(b,b+n);
priority_queue<int>que;
for(int i=0;i<n;i++)que.push(a[i]+b[i]);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j)continue;
int top=que.top();
if(a[i]+b[j]>=top)break; //不sort优化会TLE
que.pop();
que.push(a[i]+b[j]);
}
}
for(int i=0;i<n;i++){
tmp[i]=que.top();
que.pop();
}
printf("%d",tmp[n-1]);
for(int i=n-2;i>=0;i--)printf(" %d",tmp[i]);
printf("\n");
return 0;
}