int l = 0, r = n - 1;
while(/*......*/)//條件,因題而異
{
int mid = l + r >> 1;
if(/*......*/) r = mid;//中間為符不符合條件(寫>=)
else l = mid + 1;
}
cout <</*......*/ << l << /*......*/;
2、整數二分模闆2
int l = 0, r = n - 1;
while(/*......*/)//條件,因題而異
{
int mid = l + r + 1 >> 1;//注意要加1!!!
if(/*......*/) l = mid;//中間為符不符合條件(寫<=)
else r = mid - 1;
}
cout <</*......*/ << l << /*......*/;
3、浮點數二分模闆(其實和上面一樣)
double l = /*......*/,r = /*......*/;
while(/*......*/)
{
double mid = (l + r) / 2;
if(/*......*/) r = mid;
else l = mid;
}
printf("%.*lf\n", l)//*代表保留幾位小數
#include<iostream>
using namespace std;
const int N = 100010;
int n, m;
int q[N];
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i ++) cin >> q[i];
while(m --)
{
int x;
cin >> x;
int l = 0, r = n - 1;
while(l < r)
{
int mid = l + r >> 1;
if(q[mid] >= x) r = mid;
else l = mid + 1;
}
if(q[l] != x) cout << "-1 -1" << endl;
else
{
cout << l << ' ';
int l = 0, r = n - 1;
while(l < r)
{
int mid = l + r + 1 >> 1;
if(q[mid] <= x) l = mid;
else r = mid - 1;
}
cout << l << endl;
}
}
return 0;
}
2、數的三次方根
題目描述
給定一個浮點數n,求它的三次方根。
資料範圍
−10000≤n≤10000
樣例
輸入樣例:
1000.00
輸出樣例:
10.000000
代碼
#include<iostream>
using namespace std;
int main()
{
double x;
cin >> x;
double l = -10000,r=10000;
while(r - l > 1e-8)
{
double mid = (l + r) / 2;
if(mid * mid * mid >= x) r = mid;
else l = mid;
}
printf("%lf", l);
return 0;
}