目录:2020-8-16 13:41:14
二分模板
序列 a 中查找 >= x 的数中最小的一个
#include <iostream>
#include <algorithm>
using namespace std;
int n, m;
int a[1010];
int main(){
cin>>n;
cin>>m;
for(int i = 0; i < n; i++){
cin>>a[i];
}
sort(a,a+n);
int l = 1, r = n;
int mid;
while(l < r){
mid = (l + r) >> 1;
if(a[mid] >= m) r = mid;
else l = mid + 1;
}
cout<<a[l];
return 0;
}
测试结果:
10
5
4 6 7 9 5 4 1 3 9 10
5
序列 a 中查找 <= x 的数中最大的一个
#include <iostream>
#include <algorithm>
using namespace std;
int n, m;
int a[1010];
int main(){
cin>>n>>m;
for(int i = 0; i < n; i++){
cin>>a[i];
}
sort(a,a+n);
int l = 1, r = n;
int mid;
while(l < r){
mid = (l + r + 1) >> 1;
if(a[mid] <= m) l = mid;
else r = mid - 1;
}
cout<<a[l];
return 0;
}
测试结果:
10
4
1 2 4 7 8 9 10 2 3 5
4
实数域上的二分
问题:求一个数的4次方根
输入:
共一行,包含一个浮点数n。 0≤n≤10000
输出:
共一行,包含一个浮点数,表示问题的解。 注意,结果保留6位小数。
样例输入:
10000.00
样例输出:
10.000000
代码:
#include <iostream>
using namespace std;
double n;
int main(){
cin>>n;
double l = 0.0, r = 10.0;
double mid;
while(r - l > 1e-8){
mid = (r + l) / 2;
if(mid * mid * mid * mid >= n) r = mid;
else l = mid;
}
printf("%.6lf",l);
}
循环确定精度
#include <iostream>
using namespace std;
double n;
int main(){
cin >> n;
double l = 0.0;
double r = 10.0;
double mid;
for(int i = 0; i < 100; i++){
mid = (l + r) / 2;
if(mid * mid * mid * mid >= n) r = mid;
else l = mid;
}
printf("%.6lf",l);
return 0;
}