week4 作業B 四個數列

2021-10-03 22:29:39 字數 1768 閱讀 7719

題目:

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。

當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。

請你幫幫他吧!

input:

第一行:n(代表數列中數字的個數) (1≤n≤4000)

接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)

output:

輸出不同組合的個數。

example:

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

output:

5

hint:

樣例解釋: (-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 行有四...