DFS/BFS+二分基础及例题


总结

DFS

用于遍历或搜索树或图,优先沿着树的深度遍历树的节点,尽可能深的搜索树的分支

BFS

优先遍历当前节点的所有子节点,再逐层向下遍历,往往会用到队列

二分流程

1.确定二分边界
2.判断如何更新
3.二分时取中值的细节

例题

一、Find The Multiple

思路:×10或者×10+1

#include<iostream>
using namespace std;
typedef unsigned long long llu;
llu n,flag=1;
void dfs(llu x,llu y){
    if(flag==0)
    return;
    if(x%n==0){
        if(flag){
            cout<<x<<endl;
            flag=0;
        }
        return;
    }
    if(y==19)return;
    else {
        dfs(x*10,y+1);
        dfs(x*10+1,y+1);
    }
}
int main(){
    while(1){
        cin>>n;
        if(n==0)break;
        flag=1;
        dfs(1,0);
    }
    return 0;
}

二、Expanding Rods

思路:超越方程解不了,用二分的思想枚举

#include<cstdio>
#include<cmath>
int main(){
    double l,n,c,L,r,a,b,i,t;
    while(1){
        scanf("%lf%lf%lf",&l,&n,&c);
        if(l==-1)break;
        L=(1+n*c)*l;
        a=l/2;
        b=100000000000000;
        r=0;
        t=-1;
        if(n==0){printf("0.000\n");continue;}
        if(1-l/L<=0.0000001){printf("0.000\n");continue;}
        while(1){
            r=(a+b)/2;
            t=2*r*asin(l/(2*r));
            if(fabs(t-L)<0.0000001)break;
            if(t>L)a=r;
            else b=r;      
        }
        printf("%.3lf\n",r-sqrt(r*r-l*l/4));
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值