2022年藍橋杯C++B組國賽-試題D-最大數字

DawnTraveler發表於2024-04-11

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;
}

相關文章