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