题目大概:
输入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
;
}