蓝桥杯 DFS

最大数字

问题描述

给定一个正整数 NN 。你可以对 NN 的任意一位数字执行任意次以下 2 种操 作:

  1. 将该位数字加 1 。如果该位数字已经是 9 , 加 1 之后变成 0 。

  2. 将该位数字减 1 。如果该位数字已经是 0 , 减 1 之后变成 9 。

你现在总共可以执行 1 号操作不超过 AA 次, 2 号操作不超过 BB 次。 请问你最大可以将 NN 变成多少?

输入格式

第一行包含 3 个整数: N,A,BN,A,B 。

输出格式

一个整数代表答案。

题意:针对给定的数字字符串n,借助特定的操作对字符串中的数字进行修改,目的是得到最大的数字结果。这些操作被限制在给定的操作次数ab之内。

代码(40%)
复制代码
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
string n;
int a, b;
int l,mx,res;
 
void dfs(int u)
{
  if(u == l) {
    mx = max(mx, res);
    cout << mx;
    return;
  }
 
  int t = n[u]-'0';
  int x = min(9-t, a);
  a-=x;
  res = res*10 + t + x; 
  dfs(u+1);
  a+=x;
 
  if(b > t) {
    b-=(t+1);
    res = res*10 + 9;
    dfs(u+1);
    b+=t+1;
  }
}
 
signed main()
{
  // 请在此输入您的代码
  cin >> n >> a >> b;
  l = n.size();  
  dfs(0);  
 
  return 0;
}
问题
  1. dfs剪枝时,不仅要恢复a,b还有res的值

  2. 最终结果要 一个 最大值,因此在dfs边界值条件中,要注意返回多个值出现的情况

ac代码

复制代码
#include <bits/stdc++.h>
using namespace std;

#define int long long
string n;
int a, b;
int l,mx,res;
int dfs(int u)
{
  if(u == l) {
    mx = max(mx, res);
    return mx;            //第一次返回 mx 是在递归终止时,用于记录并返回当前完整路径下构建的最大数字
  }

  int t = n[u]-'0';
  int x = min(9-t, a);
  a-=x;
  res = res*10 + t + x;
  dfs(u+1);
  a+=x;
  res=(res-t-x)/10;

  if(b > t) {
    b-=(t+1);
    res = res*10 + 9;
    dfs(u+1);
    b+=t+1;
    res = (res-9)/10;
  }
  return mx;   //第二次返回 mx 是在递归调用完成后,确保将当前已经找到的最大数字传递给上层递归调用,以便在整个深度优先搜索过程中能不断更新并最终得到全局的最大数字。
}

signed main()
{
  // 请在此输入您的代码
  cin >> n >> a >> b;
  l = n.size();  
  dfs(0);  
  cout << mx;
  return 0;
}
相关推荐
FakeOccupational3 小时前
【数学 密码学】量子通信:光的偏振&极化的量子不确定性特性 + 量子密钥分发 BB84算法步骤
算法·密码学
ZhengEnCi5 小时前
S10-蓝桥杯 17822 乐乐的积木塔
算法
贾斯汀玛尔斯5 小时前
每天学一个算法--拓扑排序(Topological Sort)
算法·深度优先
大龄程序员狗哥5 小时前
第25篇:Q-Learning算法解析——强化学习中的经典“价值”学习(原理解析)
人工智能·学习·算法
exp_add35 小时前
质数相关知识
算法
小辉同志6 小时前
215. 数组中的第K个最大元素
数据结构·算法·leetcode··快速选择
小O的算法实验室7 小时前
2025年IEEE TITS,基于矩阵的进化计算+面向无线传感器网络数据收集无人机路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
OidEncoder7 小时前
编码器分辨率与机械精度的关系
人工智能·算法·机器人·自动化
memcpy07 小时前
LeetCode 2615. 等值距离和【相同元素分组+前缀和;考虑距离和的增量】中等
算法·leetcode·职场和发展
炽烈小老头7 小时前
【 每天学习一点算法 2026/04/22】四数相加 II
学习·算法