数的分解 - 蓝桥云课 (lanqiao.cn)
题目描述
题目分析
最开始想使用dfs,发现范围过大无法在规定时间运行
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N], v[N], ans;
void dfs(int dep, int sum, int start)
{
if(sum > 2019)return;
if(dep > 3)return;
if(dep == 3)
{
int flag = 0;
for(int i = 0; i < 3; i ++)
{
int x = a[i];
//cout << x << ' ';
while(x)
{
int y = x % 10;
x /= 10;
if(y == 2 || y == 4)flag = 1;
}
}
if(!flag && sum == 2019)ans ++;
//cout << '\n';
return;
}
for(int i = start; i <= 2017; i ++)
{
a[dep] = i;
dfs(dep + 1, sum + i, i + 1);
a[dep] = 0;
}
}
int main()
{
dfs(0, 0, 1);
cout << ans;
return 0;
}
故直接简单枚举即可
#include<bits/stdc++.h>
using namespace std;
int ans;
bool check(int n)
{
while(n)
{
int y = n % 10;
if(y == 2 || y == 4)return false;
n /= 10;
}
return true;
}
int main()
{
for(int i = 1; i <= 2019; i ++)
{
for(int j = i + 1; j <= 2019; j ++)
{
int k = 2019 - i - j;
if(check(i) && check(j) && check(k))
{
if(j < k)ans ++;
}
}
}
cout << ans;
}