解题思路:

最大数字,尽量从第一位开始每一位都接近 9;如果果该位是9就不用管 

1)该位 + 可增加的次数 a 是否会超过 9, 超过就可以让该位达到9,增加次数-让该位到9的次数

2)该位 < 减少次数 b;该位可以减到 0再减 1, 也就是 9

上面两个都没法做到的话,要让数字最大,只能实现增加操作;

 先加 还是 先减 实现 9 没法确定,所有要两个都试,取最大值 


注意事项:

先加 还是 先减 实现 9 没法确定的。

例如: 823 2 9

先加再减结果为 999。[9+2=9; 2 -3=9; 3 - 4 = 9; a:0; b:2]

先减再加结果为943。[8-9=9; 2 + 2=4; 3 + 0 = 3; a:0; b:0]


参考代码:

#include <bits/stdc++.h>
using namespace std;
/*
最大数字,尽量从第一位开始每一位都接近 9;如果果该位是9就不用管 
1)该位 + 可增加的次数 a 是否会超过 9, 超过就可以让该位达到9,增加次数-让该位到9的次数
2)该位 < 减少次数 b;该位可以减到 0再减 1, 也就是 9
上面两个都没法做到的话,要让数字最大,只能实现增加操作;
 先加 还是 先减 实现 9 没法确定,所有要两个都试,取最大值 
*/
string MaxNum1(string res, int a, int b){
	for(int i = 0; i < res.size(); i++){
		if(res[i] != '9'){
			int t = res[i] - '0';
			if(t + a >= 9 || t < b){
				if(t < b){// 先减
					b -= t + 1;
				}else{
					a -= 9-t;
				}
				res[i] = '9';
			}else{
				res[i] = t + a + '0';
				a = 0;
			}
		}
	}
	return res;
}
string MaxNum2(string res, int a, int b){
	for(int i = 0; i < res.size(); i++){
		if(res[i] != '9'){
			int t = res[i] - '0';
			if(t + a >= 9 || t < b){
				if(t + a >= 9){//先加
					a -= 9-t;
				}else{
					b -= t + 1;
				}
				res[i] = '9';
			}else{
				res[i] = t + a + '0';
				a = 0;
			}
		}
	}
	return res;
}
int main()
{
	string res; //用字符串表示数字 
	int  a, b;
	cin >> res >> a >> b;
	cout << max(MaxNum1(res, a, b), MaxNum2(res, a, b));
	return 0;
 }


点赞(0)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 6 条评论

ikun 8月前 回复TA
有问题啊
Yolo 9月前 回复TA
感觉暴力解肯定有问题,只不过没有新的hack。或者是我层次低了,这道题暴力是可以完全数学证明。
Yolo 9月前 回复TA
如果前+后-效果最好,但是这边用了前+后+,为啥就能最大。
uq_74678179417 9月前 回复TA
@听 要是最终9的位数一样情况下,先用减的,还能加;先用加的,没有加了,怎么办?
10月前 回复TA
为什么先加还是先减没法确定,1和2不就是考虑了什么时候用加法什么时候用减法
10月前 回复TA
我想到的是先看最高位是不是九,如果不是到九的距离和到0的距离哪个小,尽量选取小的那一个,但是还要考虑这个步骤是不是满足题目所给的步骤,不然到不了9也没用,然后用循环或者递归从最高位到最低位依次考虑,但是代码不知道怎么实现呀