快速找到和為零的四個數(POJ 3441)

2021-10-04 23:26:57 字數 1392 閱讀 1266

note:

1.題目規定a,b,c,d的元素個數(n<=4000), 則和陣列sum1, sum2要開到16000000, 開太小不可以;

2.對sum2使用二分查詢, sum2要進行排序, sum1可以不排序。

2.在sum2中查詢是否存在-sum1[i], 不能僅僅是簡單查詢是否存在, 要查詢小於等於或大於等於-sum1[i]的第乙個數的位置,以便能統計出所有等於-sum1[i]的個數。 

問題描述:

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

輸出樣例:

5解題思路:

考慮簡單情況:「給定兩組整數a, b,求出和為0的二元組的個數」, 思路是給定了兩數之和為0, 對a中每乙個數a[i], 判斷-a[i]是否在b中。即將問題轉化為在b中查詢是否存在-a[i], 二分查詢可以加快查詢速度;

本題面對四組整數之和, 可以將問題轉化為兩組整數的問題。首先列舉出a, b兩組所有可能的和sum1, 以及c, d兩組所有可能的和sum2, 將這兩組和看成新的陣列, 然後就可以利用上述思路, 使用二分查詢計算滿足條件的二元組個數了。

#include#include#includeusing namespace std;

const int maxn = 4010;

int n, k;

int a[maxn], b[maxn], c[maxn], d[maxn];

int sum1[16000010], sum2[16000010];

int main()

sort(sum2, sum2+k);

int ans = 0;

for(int i = 0; i < k; i++)

}cout << ans << endl;

return 0;

}

快速找到和為零的四個數(20)

給定四個陣列,a,b,c,d,從每個陣列找出取出乙個元素,使得a b c d 0。問滿足條件的一共有多少組。輸入樣例 第一行 每組元素的個數 剩下n行 每組陣列的元素 6 45 22 42 16 41 27 56 30 36 53 37 77 36 30 75 46 26 38 10 62 32 5...

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

定義求和問題如下 給定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個整數,分別...

二分(四個數和為零)

1267 4個數和為0 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 收藏關注給出n個整數,你來判斷一下是否能夠選出4個數,他們的和為0,可以則輸出 yes 否則輸出 no input 第1行,1個數n,n為陣列的長度 4 n 1000 第2 n 1行 a i ...