FBI树~2020.9.14

在这里插入图片描述
#输入

3
10001011

#输出

IBFBBBFIBFIIIFF

AC代码:

#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 1030;
char s[maxn];
void solve(int low,int hig){
// if(low >= hig) return;
 int mid = (low + hig)/2;
 if(low!=hig){
  solve(low,mid);
  solve(mid+1,hig);
 }
 int a = 0,b = 0;
 for(int i=low;i<=hig;i++){
  if(s[i] == '0'){
   a++;
  }
  if(s[i] == '1'){ 
   b++;
  }
 }
 if(a&&b)  cout<<"F";
 else if(a&&!b) cout<<"B";
 else   cout<<"I";
}
int main()
{
 int n;
 cin>>n;
 cin>>s+1;
 solve(1,pow(2,n));
 return 0;
}

解析:
〇题解来源说明:算法思路从洛谷博主wuhao1027处借鉴而来,仅供参考学习使用。
①解题思路:遇到有关树(二叉树)的题目,不一定要将树完整的构建出来(参考之前由前中序遍历求得后序遍历的题目),本题正是使用了这样的思路,solve()函数中也用到了类似折半查找的分块思想。
②核心算法:
1)递归部分

int mid = (low + hig)/2;
 if(low!=hig){
  solve(low,mid);
  solve(mid+1,hig);
 }
 

进入solve()函数后先求得mid的值,然后根据条件进行递归。
2)输出部分

int a = 0,b = 0;
 for(int i=low;i<=hig;i++){
  if(s[i] == '0'){
   a++;
  }
  if(s[i] == '1'){ 
   b++;
  }
 }
 if(a&&b)  cout<<"F";
 else if(a&&!b) cout<<"B";
 else   cout<<"I";

a和b两个变量的作用是记录子串中0和1出现的数量,并按照条件进行输出。
③结尾:当把这道题的题意读懂之后,我认为这道题可以迎刃而解了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值