CODEFORCES 535B 解题报告
仍然是水题,但是还是有可以说的地方。主要思路就是dfs可重排列。4,7组成的幸运数字,在n位数字的构造方式有2^n种,而数据是最多9位,则枚举只有512种,n^2的复杂度足矣。只枚举相应位数的4、7排列,前面的个数用2^n累加。只要遵循先选4再选7即可构造字典顺序,然后查找相应数。
以下是代码(可直接AC)
#include <iostream>
#include <cmath>
using std::cin;
using std::cout;
int m[2]={4,7};
int k[2000],top=0;
int create[10];
void dfs(int cur,int d);
int main()
{
int n,mod=10,cnt=1,front=0;
cin>>n;
memset(k,0,sizeof k);
while(n%mod!=n) {mod*=10;cnt++;}//计算数的位数
for(int i=1;i<cnt;i++)
front+=pow(2.0,i);//计算前面的个数
dfs(0,cnt);
for(int i=0;i<top;i++)
if(n==k[i])
cout<<i+1+front;
return 0;
}
void dfs(int cur,int d)//dfs字典序排列
{
if(cur==d)
{
for(int i=0;i<d;i++)
k[top]=k[top]*10+create[i];//将逐位记录的方式变成一个数再存数组
top++;
}else{
for(int i=0;i<2;i++)
{
create[cur]=m[i];//逐位记录数字,方便枚举,回溯
dfs(cur+1,d);
}
}
}