本博以這題為原型,分析兩種常用的帶精度問題的二分方法
第一種,常見二分模型:
while(r-l>eps)用這種模型的話,首先要根據題目確定出正確的eps,然後注意要在checkmid值後,如果滿足條件,用乙個double ans的額外變數被儲存每一次符合條件的值,到最後我們要找的答案就是ans,else
}
然後注意二分的用法,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 #includeview code#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}}
第二種:
#include #includeview code#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}}
帶權二分 記錄一些帶權二分的一些題目
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...