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