最大数字
问题描述
给定一个正整数 NN 。你可以对 NN 的任意一位数字执行任意次以下 2 种操 作:
将该位数字加 1 。如果该位数字已经是 9 , 加 1 之后变成 0 。
将该位数字减 1 。如果该位数字已经是 0 , 减 1 之后变成 9 。
你现在总共可以执行 1 号操作不超过 AA 次, 2 号操作不超过 BB 次。 请问你最大可以将 NN 变成多少?
输入格式
第一行包含 3 个整数: N,A,BN,A,B 。
输出格式
一个整数代表答案。
题意:针对给定的数字字符串n
,借助特定的操作对字符串中的数字进行修改,目的是得到最大的数字结果。这些操作被限制在给定的操作次数a
和b
之内。
代码(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;
}
问题
dfs剪枝时,不仅要恢复a,b还有res的值
最终结果要 一个 最大值,因此在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;
}