定義求和問題如下:給定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...