題目描述
給出若干個整數,詢問其中是否有一對數的和等於給定的數。
輸入格式
共三行:
第一行是整數 \(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...