Week4 B 四個數列

2021-10-04 03:47:15 字數 1048 閱讀 1917

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

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

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

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

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

輸出不同組合的個數。

若對資料和一一枚舉,則會到達n的四次方的複雜度,時間複雜度過高。因此,我們先使用前兩個陣列進行列舉,在sum陣列中記錄下他們的和,然後再列舉後兩個陣列的和,然後在sum陣列中尋找他們的相反數的個數。在尋找相反數的個數時,我們選擇對sum陣列進行排序,然後再進行二分,找出該相反數的第乙個和最後乙個位置,從而求出該相反數的個數。如此可以將時間複雜度降低。

#include

#include

using

namespace std;

intfindmax

(int x,

int n,

int*a)

else

if(a[mid]

> x)r = mid -1;

else l = mid +1;

}return ans;

}int

findmin

(int x,

int n,

int*a)

else

if(a[mid]

> x)r = mid -1;

else l = mid +1;

}return ans;

}int

main()

cout << count << endl;

}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。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,...