2023首届大学生算法大赛——正式赛 5、7(DFS)

5 幸运数字

题目描述

数字8、2、6、9是大多数中国人中最喜欢DFS的幸运数字。这几个数字的组合也被视为幸运数字,例如88。

小龙非常喜欢幸运数字。他认为只有满足以下条件的正整数才算是好的整数:

8、2、6、9中的每个数字至少在这个整数中出现一次,而且没有除了这四个之外的其他数字。

小龙想知道在1和N(含N)之间有多少个满足这一条件的整数。

输入

输入一个整数N。

输出

打印输出1到N(含N)之间幸运数字的总数量。

//分析:
/*
    dfs搜索满足条件的数
    从0开始,分别加2 6 8 9
    对2 6 8 9添加判断以保证每个数至少出现一次
*/

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll N,ans;

void Dfs(ll u,bool f2,bool f6,bool f8,bool f9) {
	if(u>N)
		return;
    //递归出口:参数大于目标值
	if(f2&&f6&&f8&&f9)
		ans++;//当2 6 8 9都存在时数目+1
	Dfs(u*10+2,1,f6,f8,f9);
	Dfs(u*10+6,f2,1,f8,f9);
	Dfs(u*10+8,f2,f6,1,f9);
	Dfs(u*10+9,f2,f6,f8,1);
}

int main() {
	cin>>N;
	Dfs(0,0,0,0,0);
	cout<<ans;
}

7 帮助小强

题目描述

小强前去面试一份工作。老板说,有个问题你如果能答上来,就能得到这份工作。可是小强怎么也答不上来,场面非常窘迫。老板说:“我不在乎你原来学了什么,我只在乎你能否快速掌握新知识。回家去再想想,如果明天能答上来,就直接来上班。”问题如下:

如果你被给予一个整数N,包含1到9的数字,你可以在这个整数的任意位置插入加号。可以在多个位置插入加号,或者一个也不插入,但是在一个位置上只能插入一个加号,不得连续插入多个加号。这样就能通过加法得到一个新的整数。请计算出按这种方法得到的所有整数的总和。

请帮助小强得到这份工作吧!

输入

输入仅包含一个整数N。

输出

打印输出按这种添加加号的方法得到的所有整数的总和。

//分析:
/*
    迭乘倍数,对t取余相加到k上,继承到下一层,每层dfs都迭加t+k
    对345手动模拟一下
    Dfs(0,345)                               0+345
        i=10
        Dfs(345%10,345/10)->Dfs(5,34)        5+34
            i=10
            Dfs(5+34%10,34/10)->Dfs(9,3)     9+3
            i=100>34回溯
        i=100
        Dfs(345%100,345/100)->Dfs(45,3)      45+3
            i=10>3回溯
        i=1000>345终止                       上式相加,得ans=444
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll n,ans;

void Dfs(ll k,ll t) {
	ans+=k+t;//t+k为每次加加号的和
	for(ll i=10;i<=t;i*=10){
		if(i<=t)
			Dfs(k+t%i,t/i);
	}
}

int main() {
	cin>>n;
	Dfs(0,n);
	cout<<ans;
	return 0;
}

村庄传送门

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

panjyash

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值