洛谷1631 序列合併

2021-08-13 17:04:04 字數 1153 閱讀 5373

題目描述

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

輸入輸出格式

輸入格式:

第一行乙個正整數n;

第二行n個整數ai,滿足ai<=ai+1且ai<=10^9;

第三行n個整數bi, 滿足bi<=bi+1且bi<=10^9.

【資料規模】

對於50%的資料中,滿足1<=n<=1000;

對於100%的資料中,滿足1<=n<=100000。

輸出格式:

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

輸入輸出樣例

輸入樣例#1: 複製

3 2 6 6

1 4 8

輸出樣例#1: 複製

3 6 7

思路是先把第二組的第乙個數和第一組所有數相加,建立乙個大根堆,再把第二組第二個數與第一組所有數相加,如果小於堆頂就把堆頂換了,維護堆,如果大則第二組第三個數,以此類推,直到第二組第n個數與第一組第乙個數相加小於堆頂,則輸出堆。

#include

using

namespace

std;

const

int maxn=100005;

bool flag;

int n,a[maxn],b[maxn],f[maxn],cnt,k=1,ff[maxn];

void pus(int x)

}void del()

}int main()

if(b[k]+a[i]>=f[1]) break;

f[1]=b[k]+a[i];

del();}}

sort(f+1,f+1+n);

for(int i=1;i<=n;i++)

printf("%d ",f[i]);

return

0;}

還有一種簡單寫法,思路一樣

#include

int a[100010],b[100010],num[100010],n;

int main()

}printf("%d ",rmin);

}return

0;}

洛谷1631 序列合併

題目描述 有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個。輸入輸出格式 輸入格式 第一行乙個正整數n 第二行n個整數ai,滿足ai ai 1且ai 10 9 第三行n個整數bi,滿足bi bi 1且bi 10 9.資料規模 對於50 的資料中,滿...

洛谷 P1631 序列合併

題目描述 有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個。輸入輸出格式 輸入格式 第一行乙個正整數n 第二行n個整數ai,滿足ai ai 1且ai 10 9 第三行n個整數bi,滿足bi bi 1且bi 10 9.資料規模 對於50 的資料中,滿...

洛谷 P1631 序列合併

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