uva 1152 和為0的4個值(中途相遇法)

2021-08-28 17:54:00 字數 1181 閱讀 4913

sum為0的值sum問題可以表示如下:給定四個列表a,b,c,d的整數值,計算多少個四元組(a,b,c,d)∈a×b×c× d是這樣的a + b + c + d = 0.

在下文中,我們假設所有列表具有相同的大小n。輸入輸入以一行上的單個正整數開始,表示後面的案例數,每個案例如下所述。該行後面是乙個空行,兩個連續輸入之間也有乙個空行。輸入檔案的第一行包含列表n的大小(此值可以大到4000)。然後,我們有n行包含四個整數值(絕對值大到2 28),它們分別屬於a,b,c和d.輸出對於每個測試用例,程式必須寫入總和為零的四元組數。兩個連續案例的輸出將用空行分隔。

樣品輸入1

-45 22 42 -16 -41 -27

56 30 -36 53 -37 77

-36 30 -75 -46 26 -38

-10 62 -32 -54 -6 45

樣品輸出

樣品說明:的確,以下五個四聯體的總和為零:( - 45,-27,42,30),(26,30,-10,-46),( - 32,22,56,-46),( - 32, 30,-75,77),( - 32,-54,56,30)。

題解:題目不難,思想也可以,希望下次遇到同型別的題目會做。

如果用四重迴圈會超時,所以中途相遇法二分成  a+b =  -(c+d),   只用兩重迴圈加上乙個二分查詢就可以解決問題。

關於lower_bound和upper_bound的用法:在從小到大的排序陣列中,

lower_bound( begin,end,num):從陣列的begin位置到end-1位置二分查詢第乙個大於或等於num的數字,找到返回該數字的位址,不存在則返回end。通過返回的位址減去起始位址begin,得到找到數字在陣列中的下標。

upper_bound( begin,end,num):從陣列的begin位置到end-1位置二分查詢第乙個大於num的數字,找到返回該數字的位址,不存在則返回end。通過返回的位址減去起始位址begin,得到找到數字在陣列中的下標。

源**:

#include #include #define maxn 4005

using namespace std;

int t, n, a[maxn], b[maxn], c[maxn], d[maxn], sum[maxn*maxn];

int main()

return 0;

}

UVa 1152 和為0的四個值

暴力o n4 超時。思路1 二分。列舉所有a b a屬於a,依次類推 把所有 a b 記錄下來放在乙個陣列sum中,對sum排序。然後列舉所有 c d 在 sum 中二分查詢有幾個這樣的值,用upper bound lower bound 就是個數,累計到結果中。o n 2logn 執行2750ms...

UVa 1152 中途相遇法 和為0的四個值

從a,b,c,d 四個陣列中 每乙個陣列中有n個元素 各挑出乙個,和為0,這樣的組合有多少?顯然,o n4 的列舉太差勁了 我們採用所謂 中途相遇法 a,b陣列一組,c,d陣列一組,分別加和,得到part1和part2陣列,排序。之後在part2中二分查詢part1的每乙個元素的相反數。注意 二分查...

4個數和為0

給出n個整數,你來判斷一下是否能夠選出4個數,他們的和為0,可以則輸出 yes 否則輸出 no input 第1行,1個數n,n為陣列的長度 4 n 1000 第2 n 1行 a i 10 9 a i 10 9 output 如果可以選出4個數,使得他們的和為0,則輸出 yes 否則輸出 no in...