题目链接: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 <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
priority_queue<int> q;
int n;
int a[100005],b[100005],c[100005];

int main()
{
  scanf("%d",&n);
  for(int i=0;i<n;i++){
    scanf("%d",&a[i]);
  }
  sort(a,a+n);
  for(int i=0;i<n;i++){
    scanf("%d",&b[i]);
    q.push(a[0]+b[i]);
  }
  sort(b,b+n);
  for(int i=1;i<n;i++){
    for(int j=0;j<n;j++){
      int ans = q.top();
      if(ans > 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;
}