P8801 [蓝桥杯 2022 国 B] 最大数字

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值