zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。
對於四個數列之和,最暴力的想法就是列舉四個數列的數,那樣時間複雜度是o(n^4)顯然複雜度太高了。
我們的思路是,計算a+b的和 o(n*n)存放在陣列a裡面(排序),然後再計算c+d的和bi,對於每個計算出來的和bi,我們使用二分查詢的方法,從陣列a裡面尋找有幾個bi的相反數。
在這裡需要注意的是,對於bi可能在a+b的和當中有多個它的相反數,哪門我們二分查詢的時候是查詢第乙個=bi的位置l,和最後乙個=bi的位置r。最後結果就是r-l+1。
#include
#include
using
namespace std;
/*首先用陣列a【】記錄a+b每個元素的組合之和4000*4000;對陣列a進行排序
然後計算每個c+d的組合之和,查詢a中是否有相反數*/
int n,a[
25000000];
int a[
5000
],b[
5000
],c[
5000
],d[
5000];
intbinaryfind1
(int pan)
//第乙個位置
else
if(a[mid]
else r=mid-1;
}//mid是符合條件的乙個點
return ans;
}int
binaryfind2
(int pan)
//最後乙個位置
else
if(a[mid]
else r=mid-1;
}//mid是符合條件的乙個點
return ans;
}int
main()
printf
("%d\n"
,count)
;}
四個數列(二分法)
一 題目描述 zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!input 第一行 n 代表數列中數字的個數 1 n 4000 接下來...
C 二分法查詢,遞迴二分法
用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...
python二分法查詢 Python 二分法查詢
二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...