解题思路:由于本题数据很小,所以不考虑数位dp,直接枚举所有情况。当然也不是无脑枚举每一位+1,+2,+3……我们发现最高位肯定越大越好,所以直接每次都使得最高位最大,如果+和-两种操作都能满足将这一位变成9,就进行搜索。由于数据量很小,就不用剪枝了,剪枝会更快一些。
注意事项:注意dfs的结束标志,防止无限进入函数。
参考代码:
#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; }
0.0分
10 人评分
简单的a+b (C语言代码)浏览:594 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:782 |
A+B for Input-Output Practice (II) (C语言代码)浏览:1043 |
WU-链表数据求和操作 (C++代码)浏览:1385 |
WU-printf基础练习2 (C++代码)浏览:2061 |
【计算球体积】 (C语言代码)浏览:1158 |
1128题解(返回值为数组的情况)浏览:571 |
1071题解浏览:585 |
1051(奇了怪了)浏览:747 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:725 |
谭宇晨 2024-02-05 00:27:36 |
我搞错了,你是对的