递归递推之二分查找

题目大概:

输入n,输入n组数据,在输入m,输入m个数,在n组数据中找到这m个数的位置。

思路:

用二分法,每次与中间变量比较,大于,则取中间变量和最大值之间的数在搜索,反之,取最小值和中间变量之间的数搜索。

感想:

这个题想法是很简单的 ,但题目最多则是300万组数据,而时间限制是600ms。

所以其中的细节需要特别注意,尤其是输入输出,要用scanf和printf。

并且我还了解到当处理的循环超过几十万时while循环比for循环效率高。

代码:

#include <iostream>

     
     
#include <cstdio>
using namespace std ;
int b [ 3000001 ];
int f ( int a , int s , int c )
{ if ( a > s ) return - 1 ;
int k ;
k =( s + a )/ 2 ;
if ( c == b [ k ]) return k ;
if ( c > b [ k ]) return f ( k +1 , s , c );
else return f ( a , k -1 , c );
}
int main ()
{ int n , m , i ;
scanf ( "%d" ,& n );
i = 1 ;
while ( scanf ( "%d" ,& b [ i ]))
{ i ++;
if ( i == n +1 ) break ;
}
scanf ( "%d" ,& m );
int a ;
while ( scanf ( "%d" ,& a )) {
printf ( "%d" , f ( 0 , n , a ));
printf ( " \n " );
m --;
if ( m <= 0 ) break ;
}
return 0 ;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值