upc 2654序列合併

2021-08-22 15:05:56 字數 1313 閱讀 6027

序列合併

時間限制: 1 sec 記憶體限制: 64 mb

題目描述

有兩個長度都是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個最小的和,相鄰數字之間用空格隔開。

樣例輸入

3 2 6 6

1 4 8

樣例輸出

3 6 7

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

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

題解:

這道題的意思就是從n*n的矩陣中挑選出n個最小的數

這個n*n的矩陣很特殊,即其中的數是按行按列遞增的

如果a[i][j]是n個最小的數其中之一,那麼a[x][y]

(1<=x<=i,1<=y<=j)也是n個最小的數其中之一,類似這樣的數一共有i*j個

因此如果i*j>n,則a[i][j]一定不是n個最小的數其中之一。

因此把那些i*j<=n的數取出來放在乙個陣列中,快排之後輸出前n個就行了。

需要開的陣列大小:s(n)=n/1+n/2+…+n/n=1166750(n=100000)

**如下:

#include

#include

#include

#include

using

namespace

std;

long

long a[100005];

long

long b[100005];

long

long ans[1200000];

int main()

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

int key=1;

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

}sort(ans+1,ans+key);

for(int i=1;iprintf("%lld ",ans[i]);

}printf("%lld\n",ans[n]);

}return

0;}

來張圖鎮樓

中石油oj 2654 序列合併

參照別人的思路自己寫的 量很大也不夠優化。include include using namespace std const int inf 1e5 10 int arr1 inf arr2 inf ans inf int n 使用結構體。struct node node temp inf void...

P1631 序列合併

做法 將 a 和 b 都從小到大排一遍序。然後組成這樣乙個矩陣 a1 b1 a1 b2 a1 b3 a1 bn a2 b1 a2 b2 a2 b3 a2 bn a3 b1 an b1 an b2 an b3 an bn 正確性 我們先把每行的頭扔進堆裡,每行的頭是每行中的最小值,所以這樣我們能在堆裡...

洛谷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 的資料中,滿...