二分
参考资料
二分
check 函数的返回值应为 。
二分结束后, 为第一个 的位置, 为最后一个 的位置。
- 整数
- 实数
int l=x,r=y+1;
while(l<r)
{
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;
}
double l=x,r=y;
while(r-l>eps)
{
double mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid;
}
三分
单峰函数如果找最大值 f(m1)>f(m2),找最小值 f(m1)<f(m2)。
double l=x,r=y;
while(r-l>eps)
{
double m1=(l*2+r)/3,m2=(l+r*2)/3;
if(f(m1)>f(m2))r=m2;
else l=m1;
}
例题
输入 个不超过 的单调不减的(就是后面的数字不小于前面的数字)非负整数 ,然后进行 次询问。对于每次询问,给出一个整数 ,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 。
给定 个形如 的二次函数 ,设 ,求 在区间 上的最小值。
给出一个 次函数,保证在范围 内存在一点 ,使得 上单调增, 上单调减。试求出 的值。
有两个城市,中间相隔着一条笔直的河,现在要修路修桥将这两个城市联通,请找出一种方案使总的花费最小。