題目:input:zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。
當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。
請你幫幫他吧!
第一行:n(代表數列中數字的個數) (1≤n≤4000)output:接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)
輸出不同組合的個數。example:
input:hint: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
output:
5
樣例解釋: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).我的解題思路:
根據題意,要求我們對於四個數列,從每個數列中選乙個數,四個數加在一起,和為0。如果遍歷四個陣列,則複雜度太高,所以可以兩兩計算。計算a+b的值,然後在計算c+d的值的過程中,找在a+b值中的相反數個數,最後統計所有的要求數對個數,即可。
我的總結:
要時刻考慮複雜度。
我的**:
#include
#include
using
namespace std;
long
long a[
4000
],b[
4000
],c[
4000
],d[
4000
],ans,n,ans[
16000000
],ind=
0,temp;
intbifind
(int num)
else
if(ans[mid]
>num) r=mid-1;
else l=mid+1;
} l=
0,r=ind-1;
while
(l<=r)
else l=mid+1;
}if(ans1==-1
||ans2==-1
)return0;
else
return ans1-ans2+1;
}int
main()
for(
int i=
0;isort
(ans,ans+ind)
;for
(int i=
0;icout
}
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 行有四...