P8801 [蓝桥杯 2022 国 B] 最大数字
分析
dfs
思路:题目的意思,要让一个数最大,用贪心去考虑,从高位开始,对其进行a / b操作,使其变为9,可让该数最大
1.a 操作:+1;b 操作:-1,对一个数位同时使用a和b,相当于不使用,故对一个数单独考虑使用a 或使用 b(a、b可以不用完!!)
使用a:
(1)当前数位的数是 x ,贪心一下,将其变为9,需要t = 9 - x次 a 操作
(2)剩余的 a 操作小于 9-x
综上,对x进行的a操作次数:t = min(9-x,a)
使用b:
(1)贪心,将x变为9,对于b操作而言,只要在为0时,才能变成9,故需要的次数 t = x + 1
(2)不够,那就不使用b,不然数反而变小
代码
#include<iostream>
using namespace std;
typedef long long ll;
const int N = 110;
int c[N],a,b,cnt;
ll ans; //记得开long long
void dfs(int id,ll v) //v表示当前0~id位,进行a、b操作后的数
{
int x = c[id];
if(id == cnt)
{
ans = max(ans,v);
return;
}
else
{
int t = min(9 - x,a); //进行a操作
a -= t;
dfs(id + 1,v * 10 + t + x);
a += t; //恢复
if(b - (x + 1) >= 0) //如果能凑到9,才进行b操作
{
b -= x + 1;
dfs(id + 1,v * 10 + 9);
b += x + 1; //恢复
}
}
return;
}
int main()
{
string s;
cin >> s >> a >> b;
cnt = s.size();
for(int i = 0;i < s.size();i ++)
{
c[i] = s[i] - '0';
}
dfs(0,0); //高位开始
cout << ans << endl;
return 0;
}