前言:
本题是一个典型的回溯问题,en.....题主最开始以为是一个贪心,贪心写的代码只通过了60%qvq
题目描述:
思路:
本题用回溯去查找先对操作1查找再回溯对操作2查找
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
char n[20];
int a, b;
long long maxx;//记录最终答案
void dfs(int i, long long sum) { //因为题上数据范围到1e17,所以不开long long见祖宗嗷
if (n[i] == '\0') {
maxx = max(maxx, sum); //一次查找完毕,进行比较
return;
}
else {
int x = n[i] - '0'; //转为int
int c = min(a, 9 - x); //看a的剩余值
a -= c;
dfs(i + 1, sum * 10 + c + x); //递归查找
a += c; //操作1的回溯
if (b >= x + 1) { //如果不能将数减到9,我们不应进行操作2
b -= (x + 1);
dfs(i + 1, sum * 10 + 9); //递归查找
b += x + 1; //操作2的回溯
}
}
}
int main() {
scanf("%s %d %d", n, &a, &b);
dfs(0, 0); //初始的i和sum均应为0
cout << maxx;
return 0;
}