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 行有四個數字,分別...