week4作業題 B 四個數列

2021-10-04 03:32:41 字數 1385 閱讀 9718

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。

當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。

請你幫幫他吧!

input:

第一行:n(代表數列中數字的個數) (1≤n≤4000)

接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)

output:輸出不同組合的個數。

exmaple:

sample input:

6-45 22 42 -16

-41 -27 56 30

-36 53 -37 77

-36 30 -75 -46

26 -38 -10 62

-32 -54 -6 45

sample output:

5

在這個題目中,我們首先想到的使用暴力的方法,直接列舉,這樣的話複雜度是o(n^4),毫無疑問,這樣的複雜度是不可以接受的。於是我們想到a+b+c+d = 0可以通過移項變為a+b = -(c+d),然後分別求a+b和*-(c+d)然後在a+b的結果陣列sum中使用二分查詢-(c+d)。這裡需要注意乙個問題就是在sum*中可能會出現重複的數字這樣的話當我們找到符合要求的數的時候還需要往左和右查詢所有符合要求的數。

#include

#include

using

namespace std;

#define _for(i , a , b) for(int i = (a); i < (b); i++)

const

int n =

4000

;int a[n]

;int b[n]

;int c[n]

;int d[n]

;int sum[n*n]

;int

main()

}sort

(sum , sum + t)

;_for

(i ,

0, n)

k = mid +1;

while

(k >=

0&& k < t && sum[k]==-

(c[i]

+ d[j]))

break;}

else

if(sum[mid]

>

-(c[i]

+ d[j]

)) r = mid -1;

else l = mid +1;

}}} cout << ans << endl;

}

week4 作業B 四個數列

題目 zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n ...

week4作業 B 四個數列

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,...

week4 B 四個數列

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第 i 行有四...