0.題目
問題描述
給定一個正整數 N 。你可以對 N 的任意一位數字執行任意次以下 2 種操作:
將該位數字加 1 。如果該位數字已經是 9 , 加 1 之後變成 0 。
將該位數字減 1 。如果該位數字已經是 0 , 減 1 之後變成 9 。
你現在總共可以執行 1 號操作不超過 A 次, 2 號操作不超過 B 次。 請問你最大可以將 N 變成多少?
輸入格式
第一行包含 3 個整數: N,A,B
輸出格式
一個整數代表答案。
樣例輸入
123 1 2
樣例輸出
933
資料範圍
1.題解
1.1 DFS搜尋
思路
從最高位開始遞迴迭代,確保每位儘可能的靠近9,位數越高儘量越大.
注意這裡的範圍 \(1<=N<=10^17\), 所以必須使用long long!
注意題目說的是最多使用A和B次,並不一定要使用全部次數!!!
程式碼
#include<bits/stdc++.h>
using namespace std;
# define ll long long
int a, b;
char ch[20];
ll ans = 0;
// x為當前位數, sum為當前和
void DFS(int x, ll sum) {
int num = ch[x] - '0';
if(ch[x]){
// 先判斷是否能加到9
int t = min(a, 9 - num);
a -= t;
DFS(x + 1, sum * 10 + num + t);
a += t; // 回溯
// 判斷能否透過減到9
if(b > num){
b -= num + 1;
DFS(x + 1, sum * 10 + 9);
b += num + 1; // 回溯
}
} else{
ans = max(ans, sum);
}
return;
}
int main() {
scanf("%s%d%d", ch, &a, &b);
DFS(0, 0);
cout << ans;
return 0;
}