POJ 二分查詢 快速找到和為零的四個數

2021-08-29 22:44:50 字數 1296 閱讀 3630

定義求和問題如下:給定4組整數a,b,c,d,找到有多少四元組(a,b,c,d)∈a×b×c×d,滿足條件a+b+c+d=0。此問題中,假設a,b,c,d具有相同的大小n。

輸入包含多組測試資料。每組測試資料的第一行包含乙個整數n,表示a,b,c,d的元素個數(n<=4000)。接下來n行每行4個整數,分別屬於a,b,c,d,每個整數的大小在-228~228之間。

對於每組測試資料,輸出滿足條件的四元組的個數。

6-45 22 42 -16

-41 -27 56 30

-36 53 -37 77

-36 30 -75 -46

26 -38 -10 62

-32 -54 -6 45

將問題轉化為兩組整數的問題。首先列舉出a、b兩組所有可能的和sum1,以及c、d兩組所有可能的和sum2,將這兩組和看成新的組數,然後根據給定兩組和為0,對於sum1中每乙個數sum1[i],判斷-sum1[i]是否在sum2中。即問題轉化為查詢問題,可以使用二分查詢加快查詢速度。首先對sum1,sum2元素排序,從小到大列舉每乙個元素sum1[i],使用二分查詢判斷-sum1[i]是否在陣列中,然後計算出現的次數。陣列中可能會出現相同的元素,所以採用變形的二分法,在有重複元素的陣列中返回小於或等於目標元素的最大元素,若返回元素等於目標元素,則沿著陣列計數該元素出現的次數。採用左右都是閉區間的區間規則。

#include

#include

using namespace std;

int sum1[

10000006

],sum2[

10000006];

int a[

4001

],b[

4001

],c[

4001

],d[

4001];

int t=0;

intfindcount

(int target)

else

}while

(sum2[l]

==target&&l//計算重複出現的次數

return num;

}int

main()

for(

int i=

0;isort

(sum1,sum1+t)

;sort

(sum2,sum2+t)

;int num=0;

for(

int i=t-

1;i>=

0;i--

) cout

}

二分查詢和快速排序

快排的中心思想,就是選取乙個元素通過一趟排序將比這個元素大的換到前面,把這個元素小的換到後面。然後在繼續進行排序。void sort int datas,int low,int high int first low int last high int key datas first while fi...

二分查詢和快速排序

二分查詢的基本思想 二分查詢就是給定乙個已經排序好的陣列,輸入你想查詢的數值,然後對陣列進行折半查詢,找到直接返回在陣列中的位置,否則返回 1。它充分利用了元素間的次序關係,採用分治策略,可在最壞的情況下用o log n 完成搜尋任務。具體實現 1 binarysearch函式傳入已經排序好的陣列 ...

二分查詢和遞迴的二分查詢

在乙個有序的陣列中查詢給定的資料項,把陣列衝中間分成兩半,然後看要查詢的資料項在陣列的哪一半,再次折半查詢。如下 public int find long searchkey else if lowerbound upperbound else private int recfind long se...