题目链接:http://acm.zzuli.edu.cn/problem.php?id=2269
思路就是先将两个数组sort一下,然后将a[0]+b[i]入队,然后再去遍历a 1-n,b 0-n的数组,如果a[i]+b[j]小于q.top(),就更新队列里面的数,因为之前已经sort过了,如果a[i]+b[j]大于等于q.top(),那么在b[j]之后的数也不会小于q.top(),所以后面的就可以省略了,不然会TLE。因为队列里一直维护都是n个数,所以最后直接输出就好了。
AC代码:
#include
#include
#include
#include
#include
using namespace std;
priority_queue q;
int n;
int a[100005],b[100005],c[100005];
int main()
{
scanf("%d",&n);
for(int i=0;i a[i]+b[j]){
q.pop();
q.push(a[i]+b[j]);
}
else break; // 不能省略
}
}
int num = 0;
while(!q.empty()){
int ans = q.top();
c[num++] = ans;
q.pop();
}
for(int i=num-1;i>=0;i--){
printf("%d%c",c[i],i==0?'\n':' ');
}
return 0;
}