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; }
除特别注明外,本站所有文章均为Manjusaka丶梦寒原创,转载请注明来自出处