解题思路:由于本题数据很小,所以不考虑数位dp,直接枚举所有情况。当然也不是无脑枚举每一位+1,+2,+3……我们发现最高位肯定越大越好,所以直接每次都使得最高位最大,如果+和-两种操作都能满足将这一位变成9,就进行搜索。由于数据量很小,就不用剪枝了,剪枝会更快一些。

注意事项:注意dfs的结束标志,防止无限进入函数。

参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define endl "\n"
#define pb push_back
#define getl(s) getline(cin,s)
#define max(a,b) a > b ? a : b
#define min(a,b) a < b ? a : b
#define abs(a)   a > 0 ? a : -a
#define lowbit(a) a & -a
using namespace std;
int n,a,b,res = 0,bit = 1;
//now,x,y,f分别代表当前数字,剩余操作1数量,剩余操作2数量,当前考虑第几位 
void dfs(int now,int x,int y,int f)
{
    res = max(now,res);
    if(x == 0 && y == 0)return ;
    if(f == 0)return ;
    int t = (now / f) % 10;//获取当前位的数字 
    if(x >= 9 - t)dfs(now + f * (9 - t),x - 9 + t,y,f / 10);//如果操作1可以变成9 
    else dfs(now + x * f,0,y,f / 10);//不能变成9 
    if(y >= t + 1)dfs(now + f * (9 - t),x,y - t - 1,f / 10);//如果操作2可以变成9 
    else dfs(now,x,y,f / 10);//不能变成9 
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>a>>b;
    while(n / bit >= 10)bit *= 10;//获取最高位的值 
    dfs(n,a,b,bit);
    cout<<res;
    return 0;
}


点赞(1)
 

9.8 分

7 人评分

 

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

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

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

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

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

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

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

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

评论列表 共有 2 条评论

谭宇晨 1年前 回复TA
@谭宇晨 我搞错了,你是对的
谭宇晨 1年前 回复TA
虽然100分,但我感觉有缺陷,比如 888 2 4