Wiki OI 1245 最小的N個和

2021-06-17 14:49:21 字數 626 閱讀 9256

演算法與思路: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 ...