总结
二分查找模板:
在不递减序列中查找:
- 查找小于x的第一个数:
int l=0,r=n;
while(l<r)
{
int mid=(l+r+1)>>1;
if(mid<x) l=mid;
else r=mid-1;
}
int l=0,r=n;
2.查找第一个小于等于x的数
int l=0,r=n;
while(l<r)
{
int mid=(l+r)>>1;
if(mid<x) l=mid+1;
else r=mid;
}
3.查找第一个大于x的数
int l=0,r=n;
while(l<r)
{
int mid=(l+r+1)>>1;
if(mid<=x) l=mid+1;
else r=mid;
}
以及一些简单的练手题目:
题目描述
给你一个有 n 个正整数元素的数列,要求把它划分成 k 段,使每段元素和的最大值最小
第二行为此数列ai
输出
输出一行一个数,为每段元素和的最大值。
样例输入
Copy
5 2
2 1 3 4 5
样例输出 Copy
9
提示
30%数据 n <= 30, k <= 10
100%数据 n <= 100000, k <= n, 0<=a i <= 109
#include<bits/stdc++.h>
using namespace std;
int a[100009],maxn=100000000+10;
int main()
{
// freopen("div.in","r",stdin);
// freopen("div.out","w",stdout);
int n,k,l;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
l=max(l,a[i]);
}
int r=maxn;
while(l<=r)
{
int mid=(l+r)/2,sum=0,ans=1;
for(int i=1;i<=n;i++)
{
if(sum+a[i]>mid)
{
ans++;sum=a[i];
}
else
sum+=a[i];
}
if(ans>k)
l=mid+1;
else
r=mid-1;
}
cout<<l;
return 0;
}
题目描述
给定一个浮点数n,求它的三次方根。
−10000≤n≤10000
输出
共一行,包含一个浮点数,表示问题的解。
注意,结果保留6位小数。
#include<bits/stdc++.h>
using namespace std;
double x;
double ans;
int main()
{
cin>>x;
if(x<0) cout<<"-",x=0-x;
double l=0,r=101;
while(r-l>1e-7)
{
double mid=(l+r)/2;
ans=mid*mid*mid;
if(ans==x) { printf("%.6lf",ans); return 0;}
if(ans>x) r=mid;
else l=mid;
}
printf("%0.6lf",l);
return 0;
}