题解:P14337 [JOI2020 预选赛 R2] 求和 / Digit Sum
linzongyi_520 · · 题解
题目链接
题目大意
JOI 君有一个介于
思路分析
对于这道题目,如果我们正向枚举再一个个判断,效率特别低。因此我们可以使用 dfs 来反向枚举。
从 set 里面,直到找不到前驱数,此时 set 的长度就是答案。
另外,
AC Code
不要抄袭
#include<bits/stdc++.h>
using namespace std;
int N;
set<int> st;
int get(int x)
{
int sum=0;
while(x > 0)
{
sum+=x%10;
x/=10;
}
return sum;
}
void dfs(int y)
{
//最大数字和不超过54
int start=max(1,y-54);
for(int x=start;x<y;x++)
{
if(x+get(x) == y && !st.count(x))//x是y的前驱数
{
st.insert(x);
dfs(x);
}
}
}
int main()
{
cin >> N;
st.insert(N);
dfs(N);
cout << st.size();
return 0;
}