其實二分,三分與分治的思想差不多,都是對乙個問題的分段操作(前提為有序)
——qwq
二分法,在乙個單調有序的集合或函式中查詢乙個解,每次分為左右兩部分,判斷解在哪個部分中並調整上下界,直到找到目標元素,每次二分後都將捨棄一半的查詢空間,因此效率很高。
例如,對於在實數區間[l,r]內遞增的連續函式f(x),求[l,r]內f(x)的零點j。j稱為(x)在[l,r]內的零點,當且僅當滿足:
任意l≤x任意j0
f(j)=0
二分法的思想是不斷將待求解區間平均分成兩份,根據求解區間中點的情況來確定目標元素所在的區間,這樣就把解的範圍縮小了一半
設當前求解區間為 [ l , r ] , 它的中點為mid =( l+r )/2則有
若f(m)<0,則j∈[m,r];
若f(m)>0,則j∈[l,m];
若f(m)=0,則j=m
那麼,二分演算法的複雜度為o(二分次數×單次判定複雜度)
1.整數定義域上的二分
int erfen(int l,intr)
else r=mid-1
; }
return
ans;
}
2.實數定義域上的二分
int erfen(double l,doubler)
return
l;}
常見的型別
1.二分答案
最小值最大(或是最大值最小)問題,這類雙最值問題常常選用二分法求解,也就是確定答案後,配合貪心、dp等其他演算法檢驗這個答案是否合理,將最優化問題轉換為判定性問題。例如,將長度為n的序列a分成最多m個連續段,求所有分法中每段和的最大值的最小是多少
2.二分查詢
用具有單調性的布林表示式求解分界點,比如在有序數列中求數字x的排名
3.代替三分
有時,對於一些單峰函式,我們可以用二分導函式的方法求解函式極值,這時通常將函式的定義域定義為整數域求解比較方便,此時dx可以直接取整數1
三分法適用於求解凸性函式的極值問題,二次函式就是乙個典型的單峰函式。
三分法與二分法一樣,它會不斷縮小答案所在的求解區間。二分法縮小區間利用的原理是函式的單調性,而三分法利用的則是函式的單峰性
設當前求解的區間為 [l,r] ,令 m=1+(l+r)/3 , m=r-(l+r)/3 , 接著我們計算這兩個點的函式值f(m1),f(m2)之後我們將兩點中函式值更優的那個點稱為好點,函式值較差的那個點稱為壞點。我們可以不停縮小求解區間,直至得出近似解
與二分一樣,我們可以指定三分的次數,或是根據 r-1的值來終止
double l=0,r=1e9;while(r-l>=1e-3
)
這裡再放幾個題看看
#include#includeusing
namespace
std;
const
int n=1e5+3
;int
n,m,x[n];
inline
bool check(int
d)
return cow>=m;
//cow>=m是成立
}int
main()
cout
}
#include#include#include
#include
using
namespace
std;
double a[100001],b[100001],sum[100001
];int
main()
double eps=1e-5
;
double l=-1e-6,r=1e6;
while(r-l>eps)
if(ans>=0) l=mid;
else r=mid;
}cout
}
#include#include#include
#include
#include
#include
using
namespace
std;
intt,test,n;
double a[10005],b[10005],c[10005
];double x,maxx=0
,l,r,lmid,rmid;
double cal(double
x) int
main()
printf(
"%.4lf\n
",cal(l));
}return0;
}
二分與三分
分值的思想 opj用longlong include include include include include using namespace std long long n long long a1 100005 int m long long a2 10005 int main scanf...
二分與三分
設定越界下標確定是否存在 1 x 2while l x 8while l setprecision 3 15while l 1e 5 1621 for i,0,100 22 從學oi到現在,二分思想是逐漸發揮其威力的。其思想跟數學歸納法很像 並不直接解決問題,而是將問題轉化為幾個相同的規模較小的問題...
二分與三分查詢
一 二分查詢 二分查詢很常見了,放乙個模板就溜。時間複雜度 o logn log以2為底。最後得到的是可行域的閉區間 l,r while r l 二 三分查詢三分查詢用於查詢乙個凸 凹 函式的極值點。時間複雜度 o 2 logn log以3為底。對於乙個區間 l,r 先取中點mid l r 2,再取...