codevs 1245 最小的N個和

2021-08-09 08:50:18 字數 1520 閱讀 2865

題目描述 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。

思路:n^2列舉 妥妥的超時 

我們或許可以二分 但是還是需要找前n個數 

所以 我們可以 先用乙個priority_queue 記錄n個值

初始化 把a[1]+b[i] 丟進乙個堆中

每次彈出最小的值 因為是最小的a+b中的任意乙個元素 所以 我們把a[1] 換成a[2] 

用來更新 堆中的元素 這一定是合法的 

直到找到n個元素為止

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;78

const

int maxn=200010;9

10int

n,sum,head_a,head_b;

1112

inta[maxn],b[maxn],ans[maxn];

1314 pairpr;

1516

struct

node

19 node(int first,int

second):first(first),second(second) {}

20 friend bool

operator

23};

24node pr;

2526 std::priority_queueq;

2728 inline void read(int&x)

3435

inthh()

45 sum=0

;46 head_a=head_b=1;47

while(sum<=n)

54for(int i=1;i<=n;++i) printf("

%d\n

",ans[i]);

55fclose(stdin);

56fclose(stdout);

57return0;

58}5960

int sb=hh();

61int main(int argc,char**argv)

**

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 ...

Wiki OI 1245 最小的N個和

演算法與思路 k路歸併 堆 優先佇列 k路歸併具體請參考劉汝佳 演算法競賽入門經典訓練指南 p189 題目要求從兩個長度為n的數列中各取出一數相加,可得到n n個和,輸出這些和公升序的前n項 由於資料太大,不能通過先求和再排序的方式來求解,這個時候就要用到堆了 首先將a,b兩陣列排序,然後將a i ...