題目描述
有兩個長度都為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 也一定...