各有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 4using
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...