poj 2785 折半列舉 二分搜尋

2022-05-02 22:09:10 字數 977 閱讀 7601

傳送門:problem 2785

題意:

給定 n 行數,每行都有 4 個數a,b,c,d。

要從每列中各抽取出乙個數,問使四個數的和為0的所有方案數。

相同數字不同位置當作不同數字對待。

題解:

如果採用暴力的話,從4個數列中選擇數組合,共有(n^4)種選擇,故時間複雜度為o(n^4),指定會超時。

但,如果將它們分成 ab,cd兩組,每組只有 n^2 個組合,而 n 的資料範圍為 n < 4000,故採用此種方法不會超時。

ac**:

1 #include2 #include3 #include4

using

namespace

std;

5#define ll long long

6const

int maxn=4000+50;7

8intn;9

int a[maxn*maxn];

10int b[maxn*maxn];

11int num[maxn][5

];12

13ll solve()

1423 sort(a+1,a+index);

24 sort(b+1,b+index);

25 ll res=0;26

/**27a+b+c+d=0 -> c+d=-(a+b)

28而c+d的所有值已經預處理好,故可通過二分查詢存在於b中 -(a+b) 的個數即可29*

*/30

for(int i=1;i < index;++i)

3138

return

res;39}

4041

intmain()

4250

return0;

51 }

view code

poj2785 折半列舉 挑戰程式設計競賽

2018 1 10 這道題目如果直接列舉的話,需要我們o n 4 的複雜度,但是我們如果用二分搜尋的話,可以加快我們的求解。由題意可以得知,我們要求出滿足a b c d 0的所有情況,那麼可以轉換為a b c d,假設我們可以求出的c d的大小,那麼我們可以求出a b的大小組成的陣列,排序後找出所有...

poj2785 二分查詢

題目大意 給定n行數 n 4000 每行4個數。從這4列中,每列選擇乙個數使其和為0 暴力列舉 o n 4 會tle。優化 列舉第1,2列算出總和s1,列舉第3,4列算出總和s2。然後列舉s1,在s2中二分查詢等於 s1的數即可 o n 2log n 2 第一次wa 沒有認識到,s2陣列中有相同的數...

二分 折半 查詢

折半查詢 又叫二分查詢,採用分治思想,適用於不經常變動且查詢頻繁的表 演算法思想 將n個元素 假設n個元素公升序 分為大致相同的兩部分,取data n 2 與目標元素m比較 若data n 2 m return n 2 若data n 2 m 則我們只要在data的左半部分繼續查詢 若data n ...