zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。
當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。
請你幫幫他吧!
input:第一行:n(代表數列中數字的個數) (1≤n≤4000)接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)
output:輸出不同組合的個數。當然最簡單的辦法是窮舉法,依次列舉a,再列舉b,再列舉c,然後二分查詢d是否存在,但是這樣複雜度太高,是o(n^3logn),所以必須優化該演算法。本題思路是a+b=-(c+d),列舉a,b求得a+b的所有值,再列舉c,d求得c+d的所有值。對每乙個a+b值,二分搜尋求得c+d是否存在,若是存在,最小索引和最大索引分別是多少。
#include
#include
using
namespace std;
int a[
5000];
int b[
5000];
int c[
5000];
int d[
5000];
int ab[
30000000];
int cd[
30000000];
intbinarysearch_min
(int goal,
int left,
int right)
//找到最小序號
}return ans;
}int
binarysearch_max
(int goal,
int left,
int right)
//找到最大序號
}return ans;
}int
getans
(int n)
}//要對cd陣列進行排序
sort
(cd,cd+size)
;int ans=0;
for(
int i=
0;i)return ans;
}int
main
(void
)
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 行有四個數字,分別...