Week4 B 四個數列

2021-10-04 03:51:22 字數 1819 閱讀 4437

week4 b - 四個數列

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

2242-16

-41-27

5630-36

53-3777-36

30-75-

4626-38

-1062-

32-54-

645

sample output

5
hint

樣例解釋: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).

解題思路

暴力就tl

要用點特別的 二分

先將前兩組相加 並用 sort 排序

再將後兩個陣列相加的相反數丟進特製的查詢函式中

函式裡用兩個二分分別找出最先出現的位置 ans1 和最後出現的位置 ans2

若沒找到返回 -1 若找到將 ans2 - ans1 + 1 返回

將這些正值相加就是符合題目的次數

code

#include

#include

#include

#include

#include

using

namespace std;

int t=0;

int s[4]

[40000];

long

long ss[2]

[16000000];

bool

cmp(

int a,

int b)

intfindf

(int x)

else

if(ss[0]

[(f+e)/2

]>x)

else

if(ss[0]

[(f+e)/2

]} f=

0;e=t-1;

while

(f<=e)

else

if(ss[0]

[(f+e)/2

]>x)

else

if(ss[0]

[(f+e)/2

](ans1!=-1

)return ans2-ans1+1;

return0;

}int

main()

int ans=0;

t=0;for

(int i=

0;isort

(ss[0]

,ss[0]

+t);

for(

int i=

0;icout<}

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。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第 i 行有四個數字,分別...