minval(优先队列)


       题目链接: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;
}

你可能感兴趣的:(补题补题补题)