折半列舉(雙向搜尋)

2022-09-12 16:15:37 字數 890 閱讀 8549

各有n個整數的四個數列a、b、c、d。要從每個數列中各取乙個數,使四個數的和為0。求出這樣組合的個數。

輸入n = 6

a =

b =

c =

d =

從4個數列中選擇共有n4種情況,全部判斷一遍不可行。不過將它們對半分成ab和cd再考慮,就可以快速解決了。從2個數列中選擇的話只有n2種組合,所以可以進行列舉。先從a、b中取出a、b後,為使總和為0需要從c、d中取出c + d = -(a + b)。因此先將從c、d中取數字的n2種方法全都列舉出來,將這些和排序,進行二分搜尋。這個演算法複雜度為o(n2logn)。

1 #include 2 #include 3 #include 4

using

namespace

std;56

#define max_n 100078

intn;

9int

a[max_n], b[max_n], c[max_n], d[max_n];

10int cd[max_n * max_n]; //

c和d中數字的組合方法

1112

void

solve()

1321

}22 sort(cd, cd+n*n);

23long

long res = 0;24

for (int i = 0; i < n; i++)

2532

}33 printf("

%lld\n

", res);34}

3536

37int

main()

3859}60

solve();

61return0;

62 }

折半列舉0 5

0.5table of contents 折半列舉 常見型別 具體題目 poj2785 poj3977 noip2014模擬賽 某種密碼 password include include include include include include define l long long defin...

折半搜尋 meet in the middle

在使用搜尋的時候,當n過大2n會超時,這時候可以用折半搜尋,把時間複雜度降低到2n 2 1 具體方法 分別搜尋前一半,把狀態放入a陣列,搜尋後一半,把狀態放入b陣列,最後統計答案。一般meet in the middle的難點主要在於最後答案的組合統計。我們可以現將a或b陣列sort,讓其有序。然後...

poj 折半搜尋

題意 給你乙個含有n n 1000 個數的數列,問這個數列中是否存在四個不同的數a,b,c,d,使a b c d 若存在則輸出最大的d 思路 完全暴力的話o n 4 會t,可以考慮雙向搜尋,公式變形為a b d c 分別列舉a b和c d,將值和下標存在結構體中,再二分查詢即可 include in...