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

2021-08-15 13:41:30 字數 634 閱讀 6523

2018-1-10

這道題目如果直接列舉的話,需要我們o(n^4)的複雜度,但是我們如果用二分搜尋的話,可以加快我們的求解。

由題意可以得知,我們要求出滿足a+b+c+d=0的所有情況,那麼可以轉換為a+b=-c-d,假設我們可以求出的c+d的大小,那麼我們可以求出a+b的大小組成的陣列,排序後找出所有滿足值為-c-d的元素的個數,進而得到結果。

#include

#include

#include

using namespace std;

const int n = 4000;

int a[n+1],b[n+1],c[n+1],d[n+1],s[n*n+1];

int n,sum;

int main()

for (int i=0;ifor (int j=0;js[i*n+j]=a[i]+b[j];}}

sort(s,s+n*n);

for (int i=0;ifor (int j=0;jint k=-(c[i]+d[j]);

sum+=upper_bound(s,s+n*n,k)-lower_bound(s,s+n*n,k);}}

cout0;}

poj 2785 折半列舉 二分搜尋

傳送門 problem 2785 題意 給定 n 行數,每行都有 4 個數a,b,c,d。要從每列中各抽取出乙個數,問使四個數的和為0的所有方案數。相同數字不同位置當作不同數字對待。題解 如果採用暴力的話,從4個數列中選擇數組合,共有 n 4 種選擇,故時間複雜度為o n 4 指定會超時。但,如果將...

POJ 3977 折半列舉

如無法區分折半列舉,二分,這裡 這題我感覺出了是用列舉,畢竟資料範圍很小,但是,集合中每個元素都有可能被選或者不被選,根據計數原理應該會有 2 1 種情況,需要刨除空集,列舉顯然是會t掉,那怎麼辦呢?考慮選出來的集合有幾種情況,有可能都在前一半,有可能都在後一半,還有可能前後都有,前後都有的情況可以...

poj 3977 折半列舉

題目大意 給定n n 35 個數字,每個數字都 2 15.其中乙個或多個數字加和可以得到s,求出s的絕對值的最小值,並給出當s取絕對值最小值時,需要加和的數字的個數。題目分析 實現 c include include include include include include includeus...