2022年蓝桥杯C++B组国赛-试题D-最大数字(DFS)

0.题目

问题描述

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

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

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

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

输入格式

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

输出格式

一个整数代表答案。

样例输入
123 1 2

样例输出
933

数据范围

1.题解

1.1 DFS搜索

思路

从最高位开始递归迭代,确保每位尽可能的靠近9,位数越高尽量越大.

注意这里的范围 1<=N<=1017, 所以必须使用long long!
注意题目说的是最多使用A和B次,并不一定要使用全部次数!!!

代码

#include<bits/stdc++.h>
using namespace std;
# define ll long long 
int a, b;
char ch[20];
ll ans = 0;

// x为当前位数, sum为当前和 
void DFS(int x, ll sum) {
	int num = ch[x] - '0';		
	if(ch[x]){
		// 先判断是否能加到9
		int t = min(a, 9 - num);
		a -= t;
		DFS(x + 1, sum * 10 + num + t);
		a += t; // 回溯
		// 判断能否通过减到9
		if(b > num){
			b -= num + 1;
			DFS(x + 1, sum * 10 + 9);
			b += num + 1; // 回溯
		}
		 
	} else{
		ans = max(ans, sum);
	}
	return;
}

int main() {
	scanf("%s%d%d", ch, &a, &b);
	DFS(0, 0);
	cout << ans;
	return 0;
}
posted @   DawnTraveler  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· DeepSeek本地性能调优
· 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略
点击右上角即可分享
微信分享提示