zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。
當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。
請你幫幫他吧!
input
第一行:n(代表數列中數字的個數) (1≤n≤4000)
接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)output
輸出不同組合的個數。
sample
input
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
sample
output5思路
首先排除四個數列的列舉,e4的複雜度太高。
那麼我們少列舉一點點,把a和b的和放一起,把c和d的和放一起,然後在兩個陣列之間找可以嗎?
但是可以想的到,如果繼續列舉這兩個大陣列,複雜度豈不是沒有變化?
所以我們用二分的方法在乙個陣列中查詢另乙個陣列中的相反數即可。複雜度o(n^2+nlogn)
**
#include
#include
using
namespace std;
int ans=0;
void
bisearch
(int
*a,int left,
int right,
int num)
if(a[mid-1]
==num&&mid>left)}if
(num>a[mid])if
(numintmain()
int*aandb=
newint
[n*n]
;int
*candd=
newint
[n*n]
;int index=0;
for(
int i=
0;iindex=0;
for(
int i=
0;isort
(candd,candd+n*n)
;for
(int i=
0;i) cout
}
week4 作業B 四個數列
題目 zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n ...
week4作業題 B 四個數列
zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,...
week4 B 四個數列
zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第 i 行有四...