zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。
當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。
請你幫幫他吧!
第一行:n(代表數列中數字的個數,1≤n≤4000)
接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)
輸出不同組合的個數。
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
output
5
這是一道十分有趣的題目,直接爆搜n4的複雜度顯然是過不去的,但是本題允許n2的複雜度,注意一共有四個數列,所以我們可以考慮拆成兩部分,中間通過某種策略去搜尋,顯然我們可以通過有序二分的方式降低複雜度。先對前兩個數列列舉求和排序,再列舉後兩個數列的和,二分該和的相反數的左右區間,求差加一後累加,即可得到結果。
二分時注意,要考慮邊界的情況,根據二分策略對ans的初值進行調整,這樣才可以保證二分出來的結果為滿足該條件的第乙個位置。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define mem(a,s) memset(a,s,sizeof(a))
int a[4]
[4001];
int n;
vector<
int> v;
intf1
(int x)
else l=m+1;
}return ans;
}intf2(
int x)
else l=m+1;
}return ans;
}int
main()
cout
}
四個數列(二分求解)
小明有四個數列 a,b,c,d,每個數列都有 n 個數字。小明從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。ps 當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第 i 行有四個...
四個數列(二分法)
一 題目描述 zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!input 第一行 n 代表數列中數字的個數 1 n 4000 接下來...
week4 二分 四個數列
title zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第...