Week4 B 四個數列

2021-10-04 04:12:07 字數 1209 閱讀 4101

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