解题思路:
位数相同的数字大小关系取决于不同最高位的大小有关,所以我们可以先找从最高位到低位最多有多少位可以变成9
观察数据发现数字n最多是1E17,也就是17位用dfs不会超时
对于剩余的A和B操作次数
B:可以遍历剩余的位数看看是否能将某一位变成9(高位优先)
A:直接在剩余位数的最高位加上剩余的A操作次数就好
参考代码:
#include<bits/stdc++.h> using namespace std; struct node { int a,b; }x[105]; int ans=0; int numa=0; int numb=0; string n; void dfs(int i,int a,int b) { if(i==n.length()||(x[i].a>a&&x[i].b>b)) { if(ans<i) { ans=i; numa=a; numb=b; } else if(ans==i) { numa=max(numa,a); numb=max(numb,b); } return; } if(x[i].a<=a) { dfs(i+1,a-x[i].a,b); } if(x[i].b<=b) { dfs(i+1,a,b-x[i].b); } } int main() { int a,b; cin>>n>>a>>b; for(int i=0;i<n.length();i++) { x[i].a='9'-n[i]; x[i].b=((n[i]-'0')+1)%10; //cout<<x[i].b; } dfs(0,a,b); for(int i=0;i<ans;i++) { n[i]='9'; } for(int i=ans;i<n.length();i++) { if(x[i].b<=numb) { numb-=x[i].b; n[i]='9'; } } for(int i=ans;i<n.length();i++) { if(x[i].a>numa) { n[i]+=numa; break; } } cout<<n; return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复