二分法:

    在看这个视频前,我对于二分法是一头雾水的,又加上这个算法我个人很容易写错emm...。视频提到ACwing上的一道题,我用自以为聪明的方法去做,结果TLE了,实在丢人,不说了,开整!

    对于例题 789:数的范围,寻找一个数前后第一次与最后一次出现的坐标。我们需要这个模板:

    

    数组定为number[];

    (1)来看第一种情况:如图,假设两个点分别是最先与最后出现的位置。求第一次x出现的位置实际上就是(1)这种情况。那么我们定一个条件

    mid=(l+r)>>1  if(number[mid]在a中)  

              r=mid;  区间变为[L,mid], 因为mid处可能是答案,所以mid不要加一也不要减一。

             else(落在b中)  

                  l=mid+1;   区间变为[mid+1,R]  

    (2)来看第二种情况:如图,就是求x最后一次出现的位置了。依然是

   int mid=(l+r+1)>>1;    if(number[mid]在b中)  

                l=mid    区间变为[mid,R],mid不要动因为mid处可能是答案

             else    

                r=mid-1  因为mid处肯定不是答案,所以要减一,区间变为[L,mid-1];

    但是注意要注意(2)中的(L+r+1)>>1,因为如果  l=r-1时,式子不加一会出现mid=L+1/2,因为向下取整,所以mid=L,进入if后会一直求出区间[L,R]造成死循环,而(1)就不会出现。

    综上,有以下两个模板,分别对应不同的情况

//区间[L,R]被分成[L,mid]和[mid+1,R]时
int bsearch_1(int l,int r)
{
while(l<r)
{
int mid=l+r >>;
if(check(mid))
r=mid;
else
l=mid+;
} }
//区间[L,R]被分成[L,mid-1]和[mid,R]时
int bsearch_2(int l,int r) 
{
  while(l<r)
  {
    int mid=l+r+ >>;
    if(check(mid))
      l=mid;
   else
      r=mid-; }
 }

   然后上789代码  :  

#include<iostream>
const int maxn=1e5+;
using namespace std; int a[maxn];
int n,k;
int main()
{
cin>>n>>k;
for(int i=;i<n;i++)
cin>>a[i];
while(k--)
{
int x;
cin>>x;
int l=,r=n-;
while(l<r)
{
int mid=(l+r)>>;
if(a[mid]>=x)
{
r=mid;
}
else
{
l=mid+;
}
}
if(a[l]!=x)
cout<<"-1 -1"<<endl;
else
{
cout<<l<<' ';
int l=,r=n-;
while(l<r)
{
int mid=(l+r+)>>;
if(a[mid]<=x)
{
l=mid;
}
else
r=mid-;
}
cout<<r<<endl;
}
}
}

    再来个手动开方嘿嘿,二分法:

    

#include<iostream>
using namespace std;
#include<cstdio>
int main()
{
double x;
while(cin>>x)
{
double l=,r=x;
while((r-l)>1e-)//精度不够再加,可以时1e-8
{
double mid=(l+r)/;
if(mid*mid>x)
r=mid;
else
l=mid;
}
printf("%lf\n",l);
}
}

  

 开三次方:ACWING  790

  

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
double x;
while(cin>>x)
{
double l,r;
if(x>=)
l=,r=x;
else
l=x,r=;
while(fabs(r-l)>1e-)
{
double mid = (l+r)/;
if(mid*mid*mid>x)
r=mid;
else
l=mid;
}
printf("%lf\n",l);
}
}

最新文章

  1. [django]用户认证中只允许登陆用户访问(网页安全问题)
  2. x86指令集同频性能提升
  3. CheckBoxList控件获取多选择,需要遍历
  4. Loaders
  5. 深入了解view以及自定义控件
  6. POSIX线程--同时执行
  7. Matlab 图像画在坐标轴下
  8. 解析XML文档之三:使用DOM解析
  9. Struts2 OGNL调用公共静态方法
  10. 回溯算法-C#语言解决八皇后问题的写法与优化
  11. 随意记的一点 js 笔记
  12. Apache与Nginx网络模型
  13. [转] 解析LayoutSubviews
  14. Servlet的学习之Request请求对象(2)
  15. Chapter 1 First Sight——11
  16. Python学习日记:day6----小知识点总结
  17. Python函数篇(6)-常用模块及简单的案列
  18. 优化Linux内核参数提高服务器负载能力
  19. c++ --&gt; c++中四种类型转换方式
  20. 视频H265格式压缩,软件压缩方法,硬件的没有条件,没法测试。

热门文章

  1. Service总结
  2. Django(十三)状态保持 —— cookie与session+ajax异步请求+session记住登录状态+cookie记住登录名密码
  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-euro
  4. 批量处理文件的Python程序
  5. 小程序填坑:2018最新getPhoneNumber功能详解
  6. Oracle IF-ELSE条件判断结构
  7. 11.swoole学习笔记--进程信号触发器
  8. PlayJava SpringMVC与Struts2杂谈
  9. 四、React创建组件、 JSX使用、绑定数据、引用图片方式、数组(列表)循环输出
  10. Git的http与ssh配置