二分練習題1 查詢元素 題解

2022-08-19 22:15:12 字數 1340 閱讀 7322

題目描述

現在告訴你乙個長度為 \(n\) 的有序陣列 \(a_1, a_2, ..., a_n\) ,以及 \(q\) 次詢問,每次詢問會給你乙個數 \(x\) ,對於每次詢問,你需要確定在陣列中是否存在某乙個元素 \(a_i = x\) 。

輸入格式

輸入的第一行包含乙個整數 \(n(1 \le n \le 100000)\) ,用於表示陣列中元素的個數。

輸入的第二行包含 \(n\) 個整數,兩兩之間有乙個空格,用於表示陣列中的元素 \(a_1, a_2, ..., a_n(1 \le a_i \le 10^9,並且 a_1 \le a_2 \le ... \le a_n)\) 。

輸入的第三行包含乙個整數 \(q(1 \le q \le 100000)\) ,用於表示詢問的次數。

接下來 \(q\) 行,每行包含乙個整數 \(x(1 \le x \le 10^9)\) ,表示要詢問的數。

輸出格式

對於每一次詢問的 \(x\) ,如果陣列中存在元素等於 \(x\) ,則輸出 「yes」 ; 否則,輸出 「no」。每個輸出結果佔單獨的一行。

樣例輸入

5

1 3 5 7 931

23

樣例輸出
yes

noyes

題目分析

本題涉及演算法:二分。

因為這道題目告訴我們陣列元素是按照單調非遞減的順序輸入的(即 \(a_i \le a_\) ),所以我們令自變數為座標 \(i\) ,應變數為陣列元素 \(a_i\) 進行二分。

我們的程式中將編寫乙個bool solve(int x)函式,它用於判斷陣列中是否存在值為 \(x\) 的元素。其判斷邏輯為:

一開始設 \(l = 1\)(陣列的左邊界的座標),設 \(r = n\)(陣列的右邊界的座標),然後只要滿足 \(l \le r\) 的條件,我就令 \(mid = (l+r)/2\)(也就是 \(l\) 和 \(r\) 的中位數),判斷 \(a[mid]\) 是否等於 \(x\) ,會有三種情況:

當退出上面的迴圈操作(即已經不滿足 \(l \le r\) 條件)時,如果我們還沒有找到等於 \(x\) 的元素,則說明在陣列 \(a\) 中不存在等於 \(x\) 的元素。

實現**如下:

#include using namespace std;

const int maxn = 100010;

int n, a[maxn], q, x;

bool solve(int x)

return false;

}int main()

return 0;

}

NYOJ練習題 刪除元素(二分查詢)

時間限制 1000 ms 記憶體限制 65535 kb 描述 題意很簡單,給乙個長度為n的序列,問至少刪除序列中多少個數,使得刪除後的序列中的最大值 2 最小值 輸入 多組測試資料,每組測試資料報含兩行。第一行乙個整數n n 10 5 序列中元素的個數。第二行依次輸入n個數a1,a2 an,1 ai...

二分練習題4 查詢最接近的元素 題解

題目出處 資訊學奧賽一本通 第七章練習7 題目描述 在乙個非降序列中,查詢與給定值最接近的元素。輸入格式 第一行包含乙個整數 n 為非降序列長度。1 le n le 100000 第二行包含 n 個元素,為非降序列各元素。所有元素的大小均在 1 10 9 之間。第三行包含乙個整數 m 為要詢問的次數...

二分練習題3 查詢小於x的最大元素 題解

題目描述 現在告訴你乙個長度為 n 的有序陣列 a 1,a 2,a n 以及 q 次詢問,每次詢問會給你乙個數 x 對於每次詢問,你需要輸出陣列 a 中小於 x 的最大元素。輸入格式 輸入的第一行包含乙個整數 n 1 le n le 100000 用於表示陣列中元素的個數。輸入的第二行包含 n 個整...