问题标题: 酷町堂:2771 二分查找1

0
0
已解决
张岳恒
张岳恒
资深光能
资深光能
#include<iostream>
#include<cstdio>
using namespace std;
int s,a[1000001],i=1;
void f(int b[],int l,int k){
	int m;
	if(l<=k){
		m=(l+k)/2;
	}
		if(b[i]==a[m]){
			cout<<m<<endl;
		}
		if(b[i]<a[m]){
		f(b,m+1,k);
		} 
		else if(b[i]>a[m]){
			f(b,l,m-1);
		} 
		else cout<<-1<<endl;
}
int main(){
	int n,m,a[100001],b[100001],l=1,k;
	cin>>n>>m;
	k=m;
	for(i=1;i<=n;i++){
		cin>>a[i];
	}
	for(i=1;i<=m;i++){
		cin>>b[i];
	}
	f(b,l,k);
    return 0;
} 

为啥RE?求大佬纠错

张岳恒在2020-03-20 12:20:50追加了内容

TLE代码

#include<iostream>
using namespace std;
int s,n;
int f(int b[],int l,int k){
	int m,t,r;
	while(l<=k){
		m=(l+k)/2;
		if(b[s]==m) return m;
		if(b[s]<m) l=m+1;
		else r=m-1;
	}
	return -1;
}
int main(){
	int a[10001],b[100001],l=1,k,m;
	cin>>n>>m;
	k=n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
		s++;
		cout<<f(b,l,k)<<endl;
	}
    return 0;
}

我的心情正如我的头像


0
已采纳
赵逸凡
赵逸凡
初级启示者
初级启示者

你想用二分写还是递归?

0
0
0
包涵宇
包涵宇
中级天翼
中级天翼

@张岳恒

我不会二分啊!!!

但这题也能用桶:

序列保证没有重复元素,并且单调递增。

这是用桶的根本!!!

思路:定义一个数组,每次输入t,a【t】=i+1

输出时:

for(int i=0;i<m;i++){
        if(a[b[i]])cout<<a[b[i]]<<"\n";
        else cout<<"-1\n";
    }

包AC

我要回答