Cho N, A, B. Tìm số nhỏ nhất > N chỉ chứa chữ số A và B với số lượng A = số lượng B.
Ví dụ
N=1234, A=2, B=3 → 2233 (có 2 chữ số 2 và 2 chữ số 3)
Thuật toán đệ quy/backtracking
- Xây dựng số từ trái sang phải.
- Giữ đếm
countA,countB. - Khi độ dài chẵn và
countA == countBvà số >N→ cập nhật kết quả. - Thử thêm
AvàBđệ quy, lấy min.
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
long long solve(long long cur, int A, int cA, int B, int cB, long long N) {
if (cur > 1e11) return 1e11;
if (cA == cB && cur >= N) return cur;
return min(solve(cur*10 + A, A, cA+1, B, cB, N),
solve(cur*10 + B, A, cA, B, cB+1, N));
}
int main() {
long long N = 1234;
int A = 2, B = 3;
cout << solve(0, A, 0, B, 0, N) << endl; // 2233
return 0;
}
Kết quả
2233