序列合并

来源:互联网 发布:淘宝网渔具店 编辑:程序博客网 时间:2024/06/05 21:18

QAQ
我们首先将数组a,b分别排序。
然后开一个小根堆
a1+b1,a1+b2……a1+bn
a2+b1,a2+b2……a2+bn
………………….
an+b1,an+b2……an+bn
首先将a1+b1,a2+b1……an+b1放入小根堆中
然后查询最小值,输出,再将输出的a[i]+b[前一个+1],放入小根堆,操作n次,输出就行了
直接用优先队列就行了

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<queue>using namespace std;int a[100100],b[100100];struct node{    int an,w,val;    bool operator<(const node &v) const{    return v.val<val;    }};priority_queue <node> q;int main(){    int w;    scanf("%d",&w);    for(int i=1;i<=w;i++)     scanf("%d",&a[i]);    for(int i=1;i<=w;i++)     scanf("%d",&b[i]);    sort(a+1,a+w+1);    sort(b+1,b+w+1);    for(int i=1;i<=w;i++)     {        node y;        y.val=a[i]+b[1];        y.an=i,y.w=1;        q.push(y);     }    for(int i=1;i<=w;i++)     {        node opt=q.top();        printf("%d ",opt.val);        q.pop();        node s;        s.val=a[opt.an]+b[opt.w+1];        s.w=opt.w+1;        s.an=opt.an;        q.push(s);     }      return 0;}