zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。
當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。
第一行:n(代表數列中數字的個數) (1≤n≤4000)
接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)
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
輸出不同組合的個數。
若對資料和一一枚舉,則會到達n的四次方的複雜度,時間複雜度過高。因此,我們先使用前兩個陣列進行列舉,在sum陣列中記錄下他們的和,然後再列舉後兩個陣列的和,然後在sum陣列中尋找他們的相反數的個數。在尋找相反數的個數時,我們選擇對sum陣列進行排序,然後再進行二分,找出該相反數的第乙個和最後乙個位置,從而求出該相反數的個數。如此可以將時間複雜度降低。
#include
#include
using
namespace std;
intfindmax
(int x,
int n,
int*a)
else
if(a[mid]
> x)r = mid -1;
else l = mid +1;
}return ans;
}int
findmin
(int x,
int n,
int*a)
else
if(a[mid]
> x)r = mid -1;
else l = mid +1;
}return ans;
}int
main()
cout << count << endl;
}return0;
}
week4 B 四個數列
zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第 i 行有四...
week4 B 四個數列
zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!輸入輸出格式input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的...
week4 B 四個數列
zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,...