zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。
當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。
請你幫幫他吧!
input
第一行:n(代表數列中數字的個數) (1≤n≤4000)
接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)
設滿足的一組數為aibicidi,如果遍歷4個陣列,複雜度為o(n^4),ai+bi+ci+di = 0,移項可得ai+bi = -(ci+di),可以將四個陣列abcd轉化為兩個大陣列apb與cpd,這時就只用找到apb陣列裡元素的相反數在cpd出現的次數即可
找apb元素的相反數的方法可以用二分法,找到apb第i個元素在cpd中的第一次出現的位置,最後一次出現的位置,將兩個位置相減,就得到第i個元素的相反數的個數了。
一道二分的題目,將在4個陣列中找到和為0的元素的問題轉化為2個陣列找到和為0的元素,並且求解的過程一致,屬於分治的思想
#include
#include
#include
#include
using namespace std;
int ans;
intfindf
(int x,
int size,
int a)
//找到元素第一次出現的位置
else
else}}
return ans;
}int
findl
(int x,
int size,
int a)
//找到元素最後一次出現的位置
else
else}}
return ans;
}int
main()
int size =0;
for(
int i =
0; i < n; i++)}
sort
(cpd,cpd+size)
;for
(int i =
0; i < size; i++)}
printf
("%d\n"
,ans)
;return0;
}
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 行有四個數字,分別...