总结
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;
}