解题思路:容易想到,从高位开始遍历,最好能进行操作使其变为9(超简单贪心)。

1、遍历每一位,计算该位变为9 通过加和减两种方式的所需步数9-v[i]、v[i]+1,并与剩余A、B值进行比较。

2、若只有加操作可以得到9,则下一步只递归加操作;反之减也是一样。若两种方式均可得到,则递归2个操作

注意事项:

本题数据量小,数字最大17位,dfs深度最多18,遍历次数最多2^0+2^1+……+2^18=2^19-1,数据量符合1秒内

参考代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int ans,a,b;
vector<int> v;

void dfs(int id,int va){//id表示位数下标,从高位开始遍历
	if(id==-1){//遍历完了所有数位,最低位下标为0,故为-1时得到答案
		ans=max(ans,va);return;
	}
	
	if(v[id]==9) {
		dfs(id-1,va*10+v[id]);return;
	}
	
	int f1=0,f2=0;//标志分别是否当前位可以通过加或减操作得到9
	if(a>=9-v[id]){//剩余a值 大于 通过加操作得到9的步数,则可以进行加操作
		f1=1;
	}
	if(b>=v[id]+1){//同理
		f2=1;
	}
	if(f1==1&&f2==1){//加、减操作都递归
		b-=v[id]+1;dfs(id-1,va*10+9);b+=1+v[id];
		a-=9-v[id];dfs(id-1,va*10+9);a+=9-v[id];	
		return;
	}		
	
	if(f1==1&&f2==0){//只递归加操作
		a-=9-v[id];dfs(id-1,va*10+9);a+=9-v[id]; return; 
	}
	
	if(f1==0&&f2==1){//减
		b-=v[id]+1;dfs(id-1,va*10+9);b+=v[id]+1; return; 
	}
	
	//都得不到9,那必定是只进行加操作
	int t=a;
	int ca=(v[id]+a)%10;
	a=0;
	dfs(id-1,va*10+ca);
	a=t;//变量回溯 
}
signed main(){
	
	int n;
	cin>>n>>a>>b;
	while(n){
		v.push_back(n%10);//依次存储低位-》高位
		n/=10; 
	}
	
	dfs(v.size()-1,0);
	cout<<ans;	
	return 0;
}


点赞(0)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论