解题思路:
最大数字,尽量从第一位开始每一位都接近 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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复