帶精度問題的二分的方法

2022-05-03 15:33:29 字數 3247 閱讀 2711

本博以這題為原型,分析兩種常用的帶精度問題的二分方法

第一種,常見二分模型:

while(r-l>eps)

else

}

用這種模型的話,首先要根據題目確定出正確的eps,然後注意要在checkmid值後,如果滿足條件,用乙個double ans的額外變數被儲存每一次符合條件的值,到最後我們要找的答案就是ans,

然後注意二分的用法,l每一次賦值為mid,而r每一次要賦值為mid-eps,如果不減去eps,有時候這個while二分會進入乙個死迴圈。

第二種模型,對精度問題就好解決,

for(int i=1;i<=200;i++)

else

}

根據題目資料來直接敲定一共最多二分多少次,根據精度到多少位或者二分的上屆最大值,

一般預設二分100次和200次就空可以滿足題目的精度和邊界問題,

具體為什麼可以滿足,我們可以這樣思考,如果上屆很大,也不會比2^200次方大吧,如果精度要求很高,那麼1/eps (即eps的倒數,如果要求1e-5的精度,就是1e5)也不會比2^200大

親測上邊界位1e10,精度位1e-4的題目可以用50次就ac,

附上上面那個題目的兩種**

第一種:

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#define rep(i,x,n) for(int i=x;i#define repd(i,x,n) for(int i=x;i<=n;i++)

#define pii pair#define pll pair#define gbtb std::ios::sync_with_stdio(false)

#define ms0(x) memset((x), 0, sizeof((x)))

#define msc0(x) memset((x), '\0', sizeof((x)))

#define pb push_back

#define mp make_pair

#define fi first

#define se second

#define gg(x) getint(&x)

#define eps 1e-6

using

namespace

std;

typedef

long

long

ll;inline

void getint(int*p);

const

int maxn=1000010

;const

int inf=0x3f3f3f3f;/*

** template code * * starts here **

*/struct

node

a[maxn];

intn,p;

bool check(double

mid)

else

}return

1.000000*mid*p-sum>0.000000;}

intmain()

if(sum<=p)

else

else

}printf(

"%.5lf\n

", ans);

}return0;

}inline

void getint(int*p)

while (ch == '

' || ch == '\n'

);

if (ch == '-'

) }

else}}

view code

第二種:

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#define rep(i,x,n) for(int i=x;i#define repd(i,x,n) for(int i=x;i<=n;i++)

#define pii pair#define pll pair#define gbtb std::ios::sync_with_stdio(false)

#define ms0(x) memset((x), 0, sizeof((x)))

#define msc0(x) memset((x), '\0', sizeof((x)))

#define pb push_back

#define mp make_pair

#define fi first

#define se second

#define gg(x) getint(&x)

#define eps 1e-6

using

namespace

std;

typedef

long

long

ll;inline

void getint(int*p);

const

int maxn=1000010

;const

int inf=0x3f3f3f3f;/*

** template code * * starts here **

*/struct

node

a[maxn];

intn,p;

bool check(double

mid)

else

}return

1.000000*mid*p-sum>0.000000;}

intmain()

if(sum<=p)

else

else

}printf(

"%.5lf\n

", ans);

}return0;

}inline

void getint(int*p)

while (ch == '

' || ch == '\n'

);

if (ch == '-'

) }

else}}

view code

帶權二分 記錄一些帶權二分的一些題目

rt 帶權二分主要是處理問題如在物品中選擇k個,或者分k組,這些問題都有乙個共性就是選得越多越好 滿足單調性質 對於平常的處理方法我們都是利用dp處理,將選擇多少個作為一維度,但是在有些情況下,時空複雜度是容不下的。由於其具有單調性,那麼我們可以利用決策單調性 或者斜率優化 或者用同樣利用到單調性的...

非常簡單地理解帶權二分(wqs二分)

非常感性簡單地理解帶權二分 又名 wqs 二分 儘管不是很嚴謹,如有錯誤請指出 large natural gosha is hunting 原題鏈結 更好閱讀體驗 設我們有 a 個紅球和 b 個藍球,用紅球抓 i 號胖可丁的概率是 a i 用藍球抓 i 號胖可丁的概率是 b i 首先我們有乙個暴力...

二分的幾種方法

64種。對其進行分類 向下取整 向上取整 共2種 閉區間 左閉右開區間 左開右閉區間 開區間 共4種 對於不下降序列a,求最小的i,使得a i key 對於不下降序列a,求最大的i,使得a i key 對於不下降序列a,求最小的i,使得a i key 對於不下降序列a,求最大的i,使得a i key...