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