Week4 B 四個數列

2022-06-22 08:51:09 字數 1294 閱讀 3440

題目:

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 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

hint

樣例解釋: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).

思路:

這道題目考察的是演算法優化問題,暴力解顯然行不通,怎麼解決呢?

我們發現四個數列可以兩兩組合一下形成兩個n*n的數列和為零的問題;

然後對於兩個數列,將其中乙個排序後我們只需要簡單地利用二分的演算法去在排序的數列裡找未排序數列的對應元素解就可以了。

1 #include2 #include3

using

namespace

std;45

int a[4000][4];6

int n,cnt=0;7

intmain()

15//

sort(a[i],a[i]+n);16}

17int index=0;18

for(int i=0;i)24}

25//

sort(ab,ab+n*n);

26 sort(cd,cd+n*n);

2728

for(int i=0;i)

37else

if(ab[i]+cd[mid]<0)40

}41while(index < n*n && ab[i]+cd[index]==0)42

46}47}

48 cout49return0;

50 }

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