二分練習題9 和為給定數 題解

2022-08-19 22:12:17 字數 1078 閱讀 1564

題目描述

給出若干個整數,詢問其中是否有一對數的和等於給定的數。

輸入格式

共三行:

第一行是整數 \(n(0 \lt n \le 100000)\) ,表示有 \(n\) 個整數。

第二行是n個整數。整數的範圍是在 \(0\) 到 \(10^8\) 之間。

第三行是乙個整數 \(m(0 \le m \le 2^)\) ,表示需要得到的和。

輸出格式

若存在和為m的數對,輸出兩個整數,小的在前,大的在後,中間用單個空格隔開。若有多個數對滿足條件,選擇數對中較小的數更小的。若找不到符合要求的數對,輸出一行「no」。

樣例輸入

4

2 5 1 4

6

樣例輸出
1 5
題目分析

這道題目可以使用時間複雜度為 \(o(n)\) 的雙指標法。(有興趣的同學可以了解一下)

但是我們這裡先來講解 \(o(nlogn)\) 的二分解法。

對於陣列 \(a_1,a_2,...,a_n\) 來說,首先我們需要使用sort函式給他們從小到大排序。

然後我們可以從 \(1\) 到 \(n\) 遍歷座標 \(i\) ,對於 \(a[i]\) 來說,我們可以在 \([i+1, n]\) 這個區間範圍內使用二分來查詢是否存在乙個元素等於 \(m-a[i]\) 。

當然咯,我們遍歷的時候也要保證 \(a[i] \le m/2\) 就可以了,因為我二分查詢的另乙個元素肯定 \(\le a[i]\) 。

實現**如下:

#include using namespace std;

const int maxn = 100010;

int n, m, a[maxn];

// check函式用於二分查詢陣列a[l,r]中是否存在值為num的元素

bool check(int num, int l, int r)

return false;

}int main()

}puts("no");

return 0;

}

openjudge 和為給定數 二分查詢

07 和為給定數 總時間限制 1000ms 記憶體限制 65536kb 描述 給出若干個整數,詢問其中是否有一對數的和等於給定的數。輸入 共三行 第一行是整數n 0 n 100,000 表示有n個整數。第二行是n個整數。整數的範圍是在0到10 8之間。第三行是乙個整數m 0 m 2 30 表示需要得...

和為給定數 二分水題

1.簡單題目敘述 蒜頭君給出若干個整數,詢問其中是否有一對數的和等於給定的數。輸入格式 共三行 第一行是整數 n 0第二行是 n 個整數。整數的範圍是在 0 到 2 10 8 之間。第三行是乙個整數 m 0 m 2 30 表示需要得到的和。輸出格式 若存在和為 m 的數對,輸出兩個整數,小的在前,大...

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

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