問題 B 序列合併

2021-10-02 20:00:19 字數 1244 閱讀 2216

題目描述

有兩個長度都為n的序列a和b,在a和b中各取乙個數相加可以得到n2個和,求這n2個和中最小的n個。

輸入第一行乙個正整數n(1 <= n <= 100000)。

第二行n個整數ai,滿足ai <= ai+1且ai <= 109

第三行n個整數bi,滿足bi <= bi+1且bi <= 109

輸出輸出僅有一行,包含n個整數,從小到大輸出這n個最小的和,相鄰數字之間用空格隔開。

樣例輸入 copy

32 6 6

1 4 8

樣例輸出 copy

3 6 7

提示建議用最小堆實現。

由於題目的資料量很大,最後要求輸出的是n個最小的和,因此堆的規模可以為n,即建立乙個規模為n的堆並維護它。題目中有乙個條件特別重要,「第二行n個整數ai,滿足ai <= ai+1且ai <= 109,第三行n個整數bi,滿足bi <= bi+1且bi <= 109」,題目中說「ai <= ai+1,bi <= bi+1」,也就是說,a和b兩個序列是遞增的。因此在做加法找最小值的時候,有的情況可以直接跳過。

#include

#include

using

namespace std;

int heap[

100002];

int a[

100002

],b[

100002];

int n;

void

downadjust

(int s,

int m)

//向下調整

heap[s]

=rc;

}void

creatheap()

//建堆

void

heapsort()

//堆排序

}int

main()

else

break

;//這裡特別重要!!!a、b序列是遞增的,因此如果出現了a[i]+b[j]>heap[1],

//再往後加的話和只能越來越大,不可能出現小於heap[1]的,因此要及時跳出迴圈。}}

heapsort()

;for

(i=1

; i)printf

("%d "

,heap[i]);

printf

("%d\n"

,heap[n]);

return0;

}

Codeup 616 問題 B 序列合併

有兩個長度都為n的序列a和b,在a和b中各取乙個數相加可以得到n2個和,求這n2個和中最小的n個。第一行乙個正整數n 1 n 100000 第二行n個整數ai,滿足ai ai 1且ai 109 第三行n個整數bi,滿足bi bi 1且bi 109 輸出僅有一行,包含n個整數,從小到大輸出這n個最小的...

問題 B 合併車廂

題目描述 有很多節火車廂被分散在一條軌道上的若干個位置 第i節車廂在position i 的位置,長度為length i 也就意味著第i節車廂佔據了這段區間 移動一節車廂乙個單位長度需要消耗乙個單位的能量,現在問你最少需要消耗多少能量能夠將所有的車廂合併到一起,即任意兩節車廂之間都沒有間隙 輸入第一...

two pointers思想(序列合併問題)

給定乙個遞增的正整數序列和乙個正整數m,求序列中的兩個不同位置的數a和b,使得它們的和恰好為m,輸出所有滿足條件的方案。如果直接兩重迴圈會使複雜度過高,two pointers思想利用序列遞增性質,來降低複雜度。如果a i a j m,那麼a i a j 1 一定 m,同時a i 1 a j 也一定...