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...