給出兩個包含n 個整數的陣列 a,b。分別在 a, b 中任意出乙個數並且相加,可以得到 n^2個和。求這些和中最小的 n 個。
輸入格式:
輸入第一行乙個整數 n(1≤n≤50000)
接下來一行輸入陣列 a,用空格隔開。
接下來一行輸入陣列 b,用空格隔開。
1≤ai,bi≤10^9
輸出格式:
從小到大輸出最小的 n 個和,用空格隔開。
樣例輸入
41 3 5 7
2 4 6 8
樣例輸出
3 5 5 7
考察核心:
優先佇列的經典應用
過載優先佇列
解題思路:
首先我們把這兩個陣列a,b排序。
把入隊我們將優先佇列的優先順序依照結構體中的sum排序
將優先順序最大的出隊例如:
則下一次入隊就是
重複n次,即兩個集合中各選乙個數組成最小的n個和。
#include#include#includeusing namespace std;
struct n//優先佇列中自定義優先順序排序
};int main()
struct n tmp=v.top();//輸出第乙個不加空格的數
cout
tmp.sum=a[tmp.posa]+b[++tmp.posb];
v.push(tmp);
for(int i=2;i<=n;++i)
}
n個最小和
題目 問題描述 給出兩個包含 n 個整數的陣列 a,b。分別在 a,b 中任意出乙個數並且相加,可以得到 n 2個和。求這些和中最小的 n 個。輸入格式 輸入第一行乙個整數n 1 n 50000 接下來一行輸入陣列 a,用空格隔開。接下來一行輸入陣列 b,用空格隔開。1 ai 10 9.輸出格式 從...
Wiki OI 1245 最小的N個和
演算法與思路 k路歸併 堆 優先佇列 k路歸併具體請參考劉汝佳 演算法競賽入門經典訓練指南 p189 題目要求從兩個長度為n的數列中各取出一數相加,可得到n n個和,輸出這些和公升序的前n項 由於資料太大,不能通過先求和再排序的方式來求解,這個時候就要用到堆了 首先將a,b兩陣列排序,然後將a i ...
codevs1245 最小的N個和
題目描述 description 有兩個長度為 n 的序列 a 和 b,在 a 和 b 中各任取乙個數可以得到 n 2 個和,求這n 2 個和中最小的 n個。輸入描述 input description 第一行輸入乙個正整數n 第二行n個整數ai 且ai 10 9 第三行n個整數bi,且bi 10 ...