解题思路:
最大数字,尽量从第一位开始每一位都接近 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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复