AcWing 4868. 数字替换(DFS + 剪枝优化)
创始人
2024-05-28 21:14:20
0

AcWing 4868. 数字替换(DFS + 剪枝优化)

  • 一、问题
  • 二、思路
  • 三、代码

一、问题

在这里插入图片描述

二、思路

题目中要求变换次数最小,其实第一印象应该是贪心,即我们每一次都去成各位中最大的那个数字。但是这个想法很容易推翻。因为你这次乘了一个最大的数,很有可能导致在最后的结果每一位都比较小,相反如果你这次乘了一个较小的数,可能最后的结果中有一位很大。也就是说,你只能保证当前操作是最优的,但是往后多看几步的话,就不一定是最优的了。

所以我们只能暴力枚举了。

枚举的过程中,我们需要存储一下这个数字都有哪几位,然后从大到小开始枚举,这个操作属于剪枝优化中的搜索顺序优化。

另外,我们还可以进行两次最优性剪枝。即,如果当前的操作次数已经大于我们之前算出来的答案了,我们就不需要去进行后续的操作了,直接舍去。

其次,还有一个最优性剪枝比较难想。

我们很容易观察出,n位数乘以一个1位数,最终的结果位数最多是n + 1的。证明也很简单,我们可以让每一位都是9,再去乘1个9,即使是这样,最后的位数依旧是最多多1。

假设当前有cntcntcnt位,操作次数是stepstepstep,目标是nnn位,那么我们还需要进行的最小操作次数是n−cntn-cntn−cnt。那么最终总的操作次数一定是大于等于step+n−cntstep+n-cntstep+n−cnt的。如果这个数是大于我们之前的最优解的话,也可以直接舍去。

三、代码

#include
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair pii;
const int N = 1e5 + 10;
ll n, x, ans = INF;void dfs(ll x, int step)
{bool st[12] = {0};int cnt = 0;for(ll y = x; y; y /= 10){cnt ++;st[y % 10] = true;}if(n - cnt + step >= ans)return;if(step >= ans)return;if(cnt > n)return;if(cnt == n){ans = step;return;}for(int i = 9; i >= 2; i -- ){if(st[i])dfs(i * x, step + 1);}
}void solve()
{cin >> n >> x;dfs(x, 0);if(ans == INF){cout << -1 << endl;}else{cout << ans << endl;}	
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();
}

相关内容

热门资讯

不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
安卓文字转语音tts没有声音 安卓文字转语音TTS没有声音的问题在应用中比较常见,通常是由于一些设置或者代码逻辑问题导致的。本文将...
APK正在安装,但应用程序列表... 这个问题可能是由于以下原因导致的:应用程序安装的APK文件可能存在问题。设备上已经存在同名的应用程序...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
报告实验.pdfbase.tt... 这个错误通常是由于找不到字体文件或者文件路径不正确导致的。以下是一些解决方法:确认字体文件是否存在:...