2023首届大学生算法大赛 - 幸运数字

 


根据题目所给,整数N最大达到了10^12,而C++默认1s的运算量只有10^8,所以这道题用for从1开始暴力到N肯定行不通(在蓝桥杯说不定能拿点分)。

那我们换一个思路,直接去枚举所有可行的幸运数字。

要枚举的数字,每位上都可以是(8,2,6,9),如果有两位数,最多有4*4种情况,三位数就是4*4*4,N<10^12,易得最多12位,复杂度最大4^12,大约一千万的计算量,小于一个亿。

所以直接一个深搜就可以解决这道题。

约束条件:1、(8,2,6,9)每个都至少有一个

                  2、枚举出来的数要小于输入的N

解空间树:

然后根据解空间树写递归就可以了。

AC代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

int n,vis[10],ans;
void dfs(int now){
    if(now>n)return;
    if(now<=n and vis[8] and vis[2] and vis[6] and vis[9])ans++;
    vis[8]++;
    dfs(now*10+8);
    vis[8]--;
    vis[2]++;
    dfs(now*10+2);
    vis[2]--;
    vis[6]++;
    dfs(now*10+6);
    vis[6]--;
    vis[9]++;
    dfs(now*10+9);
    vis[9]--;
}

signed main(){
    cin>>n;

    dfs(0);

    cout<<ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_17807067/article/details/129940235