0
点赞
收藏
分享

微信扫一扫

递归递推之二分查找


题目大概:


输入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 条评论