holla


私信TA

用户名:dotcpp0633558

访问量:707

签 名:

等  级
排  名 28820
经  验 480
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

最大数字,尽量从第一位开始每一位都接近 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分

4 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

有问题啊
2024-05-02 14:11:48
感觉暴力解肯定有问题,只不过没有新的hack。或者是我层次低了,这道题暴力是可以完全数学证明。
2024-04-23 15:51:12
如果前+后-效果最好,但是这边用了前+后+,为啥就能最大。
2024-04-23 15:49:35
为什么先加还是先减没法确定,1和2不就是考虑了什么时候用加法什么时候用减法
2024-03-11 12:22:07
我想到的是先看最高位是不是九,如果不是到九的距离和到0的距离哪个小,尽量选取小的那一个,但是还要考虑这个步骤是不是满足题目所给的步骤,不然到不了9也没用,然后用循环或者递归从最高位到最低位依次考虑,但是代码不知道怎么实现呀
2024-03-11 11:44:00
  • «
  • 1
  • »