3.11日 训练B题

题目大意是,从1到n有多少个数,是由两个以内的 个位数字 组成。

 

写一个部分数据的代码可以发现,答案相对于输入的数据来说是挺小的。

 

挨个判断时间不够

排列组合,要单独考虑0,还有判断是否超出所给的n,太麻烦。

 

所以我感觉较为简单的方法是,直接那两个数来进行排列,对数据n进行比较。最然看着每一个dfs里边都有九个循环,实际上能用的着的数据没几个。

 

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
long long n,k,m,sum;
bool vis[20];
void dfs(long long num,int s)//两个参数,一个是当前数字大小,一个是用了几个数字了 
{
    if(num>n)return ;
    for(int i=0;i<=9;i++)
    {
        if(s<2&&!vis[i])    //还有空位置 ,可用新数字 
        {
            vis[i]=1;
            dfs(num*10+i,s+1);
            vis[i]=0;
        }
        if(s<=2&&vis[i])//有没有空位置都可以用旧数字 
        {
            dfs(num*10+i,s);
        }
    }
    sum++;    //计数 
}
int main()
{
    cin>>n;
    for(int i=1;i<=9;i++)
    {
        vis[i]=1;
        dfs(i,1);
        vis[i]=0;
    }
    cout<<sum;
} 

 

posted @ 2021-03-11 21:33  Manjusaka丶梦寒  阅读(97)  评论(0编辑  收藏  举报