解题思路:
最大数字,尽量从第一位开始每一位都接近 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 人评分
我想到的是先看最高位是不是九,如果不是到九的距离和到0的距离哪个小,尽量选取小的那一个,但是还要考虑这个步骤是不是满足题目所给的步骤,不然到不了9也没用,然后用循环或者递归从最高位到最低位依次考虑,但是代码不知道怎么实现呀
uq_74678179417 2024-03-27 10:08:02 |
要是最终9的位数一样情况下,先用减的,还能加;先用加的,没有加了,怎么办?
C语言训练-计算1~N之间所有奇数之和 (C语言代码)浏览:720 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:605 |
九宫重排 (C++代码)浏览:1326 |
剪刀石头布 (C语言代码)浏览:1747 |
C语言考试练习题_保留字母 (C语言代码)浏览:700 |
数字游戏 (C++代码)浏览:1177 |
简单的a+b (C语言代码)浏览:460 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:473 |
【出圈】 (C++代码)简单循环浏览:628 |
孤独的骑士 (C语言代码)浏览:1363 |