快轉到主要內容

B. Number of Smaller

目錄

題目內容
#

給予兩個陣列,均為已排序遞增陣列,個別長度為 \(n\) 和 \(m\) ,對於第二個陣列的每個元素,找到第一個陣列中,比目前元素小的元素數。

輸入 : 第一行有兩整數 \(n\) 和 \(m\) \((1 \le n, m \le 10^5 )\) , 代表兩陣列長度。第二行有 \(n\) 個整數 \(a_i\) ,代表第一個陣列的元素,第三行有 \(m\) 個整數 \(b_i\) ,代表第一個陣列的元素 \((−10^9 \le a_i, b_i \le 10^9)\)

輸出 : 輸出 \(m\) 個數字,代表 \(b_i\) 與第一個陣列中,比 \(b_i\) 小的元素數。

解題想法
#

本題目是章節中所提到的進階題,尚不了解者可以返回閱讀

在此宣告兩陣列 \(a\), \(b\) ,個別長度為 \(n\) 和 \(m\) ,並且宣告一變數 \(now\) ,用於紀錄與第一個陣列中,比目前元素小的元素數。

因此,在走訪 \(b\) 陣列所有元素時,可以利用一 while 迴圈來檢測 \(a_{now}\) 是否較目前元素小,否則中止此迴圈。

注意

在輸入元素至兩陣列 \(a\) 和 \(b\) 後,必須將 \(a_n\) 設置為比最大值還大的值,即 \((1 \times 10^{9} < a_n)\)

在每次迴圈的最後,都要輸出 now , 代表第一個陣列中,比 \(b_{now}\) 小的元素數,並且輸出保持嚴格比對。

範例程式
#

#include <bits/stdc++.h>
#define LL long long
using namespace std;

LL n, m, a[200005], b[200005], now = 0;

int main() {
	cin >> n >> m;	
	for (int i = 0; i < n; i++) cin >> a[i]; 
	for (int i = 0; i < m; i++) cin >> b[i];
	a[n] = INT_MAX;	
	for (int i = 0; i < m; i++) {
		while (a[now] < b[i]) now++;
		if (i) cout << ' ';
		cout << now;
	}
	cout << '\n';
	return 0;
}
Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中