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

2022-08-19 22:15:11 字數 1271 閱讀 7370

題目描述

現在告訴你乙個長度為 \(n\) 的有序陣列 \(a_1, a_2, ..., a_n\) ,以及 \(q\) 次詢問,每次詢問會給你乙個數 \(x\) ,對於每次詢問,你需要輸出陣列 \(a\) 中小於 \(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\) ,如果陣列 \(a\) 中存在小於 \(x\) 的元素,則輸出陣列 \(a\) 中滿足小於 \(x\) 條件的所有元素中最大的元素;否則輸出「-1」 。每個輸出結果佔單獨的一行。

樣例輸入

5

3 5 7 9 1132

915

樣例輸出
-1

711

題目分析

本題涉及演算法:二分。

本題思路和上一題——《查詢大於等於x的最小元素》——類似。

我們同樣還是在初始時開乙個 \(l = 1\) ,開乙個 \(r = n\) (分別表示左右邊界),開乙個 \(res = -1\) (用於記錄小於 \(x\) 的最大的數的座標)。

滿足迴圈條件 \(l \le r\) 時使 \(mid = (l+r)/2\) ,並判斷:

實現**如下:

#include using namespace std;

const int maxn = 100010;

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

// solve函式用於返回大於等於x的最小元素

int solve(int x)

else r = mid - 1;

}if (res == -1) return -1; // 如果迴圈結束res==-1,說明沒有找到答案

return a[res]; // 因為res存的是最優解的座標,所以返回a[res]

}int main()

return 0;

}

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

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

C語言基礎練習題 二分查詢

在排序陣列中查詢元素的第乙個和最後乙個位置 給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。如果陣列中不存在目標值 target,返回 1,1 示例 1 輸入 nums 5,7,7,8,8,10 target 8 輸出 3,4 示例...

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

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