演算法與思路:k路歸併 + 堆(優先佇列),k路歸併具體請參考劉汝佳《演算法競賽入門經典訓練指南》p189;
題目要求從兩個長度為n的數列中各取出一數相加,可得到n*n個和,輸出這些和公升序的前n項;
由於資料太大,不能通過先求和再排序的方式來求解,這個時候就要用到堆了;
首先將a,b兩陣列排序,然後將a[i] + b[1]壓入堆中,設每次出堆的元素為sum = a[a] + b[b],
則將a[a] + b[b + 1]入堆,這樣可以保證前n個出堆的元素為最小的n項;在實現的時候,
可以不用儲存b陣列的下標,通過sum - b[b] + b[b + 1]來替換a[a] + b[b + 1]來節省空間。
#include#include#includeusing namespace std;
const int n = 100005;
struct node
}heap[n * 2];
priority_queueq;
int cmp(int x, int y)
int main()
); for(i = 1; i <= n; i++)
); } return 0;
}
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 ...
codevs 1245 最小的N個和
題目描述 description 有兩個長度為 n 的序列 a 和 b,在 a 和 b 中各任取乙個數可以得到 n 2 個和,求這n 2 個和中最小的 n個。輸入描述 input description 第一行輸入乙個正整數n 第二行n個整數ai 且ai 10 9 第三行n個整數bi,且bi 10 ...
codevs 1245 最小的N個和
題目描述 description 有兩個長度為 n 的序列 a 和 b,在 a 和 b 中各任取乙個數可以得到 n 2 個和,求這n 2 個和中最小的 n個。輸入描述 input description 第一行輸入乙個正整數n 第二行n個整數ai 且ai 10 9 第三行n個整數bi,且bi 10 ...