njupt 1163 活动安排问题 从中看到的二分问题 二分模版

http://blog.csdn.net/yangshuolll/article/details/8040534

从 南京邮电这道题中折射出自己二分问题的不足

自己就很少研究二分这类算法的模版   没有形成一个固定的模板  当自己码了好多二分查找的问题好 在众多的模版中 找到了个最稳定的模版

直接贴代码  :      在10个数中 查找 确定的数

二分稳定模版

这里一定要加( middle=(l+r)/2  ) 要注意逻辑运算符的运算顺序要大于 赋值运算符 


int a[n];
while(scanf("%d",&find))
{
      l=0;
      r=n+1;
     while(    (middle=(l+r)/2 )  &&  l+1<r)    //这里一定要加( middle=(l+r)/2  ) 要注意逻辑运算符的运算顺序要大于 赋值运算符 
     {
             if( a[middle]>find  )   r=middle;
             else l=middle;
     }
    printf( "%d",a[middle]);   
}

测试样例:

#include<stdio.h>
int a[10]={0,1,2,5,6,7,8,13,15,17};
int main()
{
   int l,r,middle;
   int find;
   while(scanf("%d",&find))
   {
       l=0; 
       r=10;  //这里右边界r要特别的注意数组存到了第9位 但是 r应当比9位多一位 扩展到10 否则查找不到17这右边界上的结果
      while( ( middle=(l+r)/2 ) && l+1<r)
      {
         printf("l=%d m=%d r=%d\n",l,middle,r);             
         if( a[middle]>find )r=middle;
         else  l=middle;            
      }    
    printf("l=%d m=%d r=%d\n",l,middle,r);
    printf("%d %d %d\n",a[l],a[middle],a[r]); //middle 就是要找的位数 其中如果找不到要找的值 输出的是最靠近find的最大值。
  
  } 
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值