关于二分边界和返回
查看原帖
关于二分边界和返回
313616
Gsmdog_H楼主2020/12/26 18:34

1.1.为什么不用写returnreturn呢?

2.2.为什么边界写(l>rl>r), (l,mid1l,mid-1)不对,写(l==rl==r),(l,midl,mid)就对了???

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

ll n;
char a[20000];

void make_tree(ll l, ll r){
	if(l > r) return;
	int mid = l + (r - l >> 1);
	make_tree(l , mid-1);
	make_tree(mid+1 , r);
	bool B = true, I = true;
	for(register ll i = l; i <= r; ++i){
		if(a[i] == '1') B = false;
		if(a[i] == '0') I = false;
	}
	if(B)printf("B");
	else if(I)printf("I");
	else if(!B and !I)printf("F");
}

int main(){
	scanf("%lld", &n);
    scanf("%s", (a+1));
	make_tree(1 , pow(2 , n));
	return 0;
}

这是两处错误的代码

正确如下


#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

ll n;
char a[20000];

void make_tree(ll l, ll r){
	int mid = l + (r - l >> 1);
	if(l != r){
		make_tree(l , mid);
		make_tree(mid+1 , r);
	}
	bool B = true, I = true;
	for(register ll i = l; i <= r; ++i){
		if(a[i] == '1') B = false;
		if(a[i] == '0') I = false;
	}
	if(B)printf("B");
	else if(I)printf("I");
	else if(!B and !I)printf("F");
}

int main(){
	scanf("%lld", &n);
    scanf("%s", (a+1));
	make_tree(1 , pow(2 , n));
	return 0;
}

2020/12/26 18:34
加载中...