$ CF9C進数の番号の$
Aユニバーサル - 対象は難しいことではありません、急いで言う\((QAQ)を\)
:この問題の解決策の主なアイデア\(DFS \) (\(DFS \)大法が良いです!)
要求出力の対象ため\(1-N \)は、各桁の自然数のみを含む\(0 \)と\(1 \)の値の数、我々は含む各桁に沿った、ということを知っている\(0 \)と\ (1 \)は最小数は少ないですか?もちろん\(1 \)これを行うのは明らかにされていません。だから、私たちは、dfs
から必要があります\(1 \)検索を開始します。
また、各桁の自然数のみが含まれているため、と考えることができます\(0 \)と\(1 \)ので、我々は再帰的に次のレベルに呼び出すことができます。
dfs(cur*10+1);
dfs(cur*10);
dfs(1) //在int main()中
この再帰呼び出しは必ずしも正確である、となぜですか?ビューでは、とき、簡単な例を与える(CUR == 1 \)を\、呼び出されるときdfs(11)
とdfs(10)
、これら二つの数が質問の意味と一致している一方で、というように、それぞれの層を呼び出すと、自然に正しいですの。
境界再帰呼び出しは、それは何ですか?熱があるときif(cur>n) return;
ならば\(CURの\は)されている\(> N \)、そして再帰的にもちろん、あなたがしたいので、それのポイントが何であるか(リターン\)\。他の例限り、カウンタ\(ANS ++ \)その上に。
コードの一部が与えられます。
void dfs(int cur)
{
if(cur>n) return; //递归边界,return
else ++ans; //计数器++
dfs(cur*10+1); //递归调用
dfs(cur*10); //继续递归调用
}
この記事は、一般的なコンテンツ\(OK \) A。そして、完全なコード与える(\↓↓↓)\を
#include<bits/stdc++.h>
using namespace std;
int n,ans;
inline int read() //我喜欢快读
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void dfs(int cur)
{
if(cur>n) return;
else ++ans;
dfs(cur*10+1);
dfs(cur*10);
}
int main()
{
n=read();
dfs(1);
printf("%d",ans); //输出ans的值
return 0;
}