標籤:sort i++ 規模 優先 turn href queue nbsp str
題目描述 Description
有兩個長度為 N 的序列 A 和 B,在 A 和 B 中各任取一個數可以得到 N^2 個和,求這N^2 個和中最小的 N個。
輸入描述 Input Description
第一行輸入一個正整數N;第二行N個整數Ai 且Ai≤10^9;第三行N個整數Bi,
且Bi≤10^9
輸出描述 Output Description
輸出僅一行,包含 n 個整數,從小到大輸出這 N個最小的和,相鄰數字之間用
空格隔開。
範例輸入 Sample Input
5
1 3 2 4 5
6 3 4 1 7
範例輸出 Sample Output
2 3 4 4 5
資料範圍及提示 Data Size & Hint
【資料規模】 對於 100%的資料,滿足 1≤N≤100000。
思路
先把兩個數組從小到大排個序
先求出a數組中每個數與b數組中第一個數的和,作為堆的初始值,建一個小根堆,以num為優先順序,y其次
由於我們不確定是a中每個數加b中最小數比較小,還是b中每個數加a中最小數比較小
所以要讓堆動起來,插入的元素就是a中當時的元素與b中下一個元素的和,每次彈出堆頂元素,重複n次即可
#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;}
codevs1245 最小的N個和