1. 程式人生 > >最小n個和(優先佇列)

最小n個和(優先佇列)

給出兩個包含 nn 個整數的陣列 AA,BB。分別在 AA, BB 中任意出一個數並且相加,可以得到 n^2n2個和。求這些和中最小的 nn 個。

輸入格式
輸入第一行一個整數 n(1 \le n \le 50000)n(1≤n≤50000)。

接下來一行輸入陣列 AA,用空格隔開。

接下來一行輸入陣列 BB,用空格隔開。

1 \le A_i, B_i \le 10^91≤Ai​,Bi​≤109

輸出格式
從小到大輸出最小的 nn 個和,用空格隔開。

樣例輸入
4
1 3 5 7
2 4 6 8
樣例輸出
3 5 5 7

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int n,a[100001],b[100001];
struct node{
    int y,num;
    bool operator <(const node &v)const
    {
        return num>v.num;
    }
};
node k;
priority_queue<node>q;
int main()
{
    cin>>n;
    
for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; sort(a+1,a+n+1); sort(b+1,b+n+1); for(int i=1;i<=n;i++) { k.y=1; k.num=a[i]+b[1]; q.push(k); } int s=1; while(s<=n) { node now
=q.top(); q.pop(); if(now.y+1<=n) { k.y=now.y+1; k.num=now.num-b[now.y]+b[now.y+1]; q.push(k); }s++; cout<<now.num<<" "; } return 0; } //AC #include<iostream> #include<queue> #include<algorithm> using namespace std; int a[100005],b[100005],c[100005];int n;; struct data{ int aa,bb,c; }o[100005],z; bool operator<(data x,data y) { return x.c>y.c; } priority_queue<data> q; int main() { cin>>n;int l1=1,l2=1; for (int i=1;i<=n;++i) { cin>>a[i]; } sort(a+1,a+1+n); for (int i=1;i<=n;++i) { cin>>b[i]; } sort(b+1,b+1+n); for (int i=1;i<=n;++i) { o[i].aa=1; o[i].bb=i; o[i].c=a[o[i].aa]+b[o[i].bb]; q.push(o[i]); } for (int i=1;i<=n;++i) { z=q.top(); q.pop(); cout<<z.c; if(i!=n)cout<<" "; z.aa++; z.c=a[z.aa]+b[z.bb]; q.push(z); } }