蓝桥每日一题2023.9.13

题目描述

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

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

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

你现在总共可以执行 1 号操作不超过 A 次,2 号操作不超过 B 次。

请问你最大可以将 N 变成多少?

分析

错误想法:每次都先用减法,因为用加法或着减法的次数可以去最优值,故选用dfs算法,去最优解

dfs中的两个数分别是位数以及现在这个数是多少,要加的化可以在需要操作的a中和你剩余的操作a中选择最小的加上即可,但是对于b而言要减的话必须减到‘9’才能进行这个操作

#include
using namespace std;
typedef long long ll;
string n;
int a, b, len;
ll ans;
void dfs(int num, ll now)
{
	if(num >= len)
	{
		ans = max(ans, now);
		return;
	}
	int xa = 9 - (n[num] - '0');
	int k = min(xa, a);
	a -= k;
	dfs(num + 1, now * 10 + (n[num] - '0') + k);
	a += k;
	int xb = n[num] - '0' + 1;
	if(b >= xb)
	{
		b -= xb;
		dfs(num + 1, now * 10 + 9);	
		b += xb;
	}
}
int main()
{
	cin >> n >> a >> b;
	len = n.size();
	dfs(0, 0);
	cout << ans; 
	return 0;
}

你可能感兴趣的:(蓝桥杯)