问题分析
这道题属于贪心加回溯。所有操作如果能使得高位的数字变大必定优先用在高位,因为对高位的影响永远大于对低位的影响。然后我们再来分析一下,如何使用这两种操作?对于加操作,如果能使这一位的数字加到9则变成9,否则使这个数字尽量大。对于减操作,如果能使这一位的数字减到9则变成9,否则不采用减操作。然后我们用回溯来分别对该位进行加操作和减操作,记录最大值。时间复杂度大概是 O ( 2 l g n ) O(2^{lg^{n}}) O(2lgn),不超过 1 0 4 10^{4} 104的数量级。因此回溯是可行的。
AC_Code
#include <bits/stdc++.h>
using namespace std;
string result;
void dfs(string str,int i,int a,int b){if(i==str.size()||a==0&&b==0){if(result<str){result=str;}return;}char ch=str[i];if('9'-ch<=a){//能加到9 str[i]='9';dfs(str,i+1,a-('9'-ch),b);}else{//不能加到9 str[i]=ch+a;dfs(str,i+1,0,b);}if((ch-'0'+1)<=b){//能减到9 str[i]='9';dfs(str,i+1,a,b-(ch-'0'+1));}else{//不能减到9 str[i]=ch;dfs(str,i+1,a,b); }
}
int main() {string str;int a,b;cin>>str>>a>>b;dfs(str,0,a,b);cout<<result<<endl;return 0;
}