C.Unlucky Numbers
A题的进阶版,用类似数位dp的方法做的,可以浅浅看一下我丑陋的代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10;
int n, m;
int a[N], b[N];
vector<int> v[15];
vector<int> v1;
vector<int> v2;
vector<int> getLine(int x){
vector<int> v;
while(x){
v.push_back(x % 10);
x /= 10;
}
return v;
}
int ans, num;
void dfs(int x, int l, int ok1 = 0, int ok2 = 0, int ma = 0, int mi = 9, int numm = 0){
if(x == l){
// cout << l << "\n";
if(ma - mi < num){
// cout << ma << " " << mi << " " << numm << " " << x << "\n";
num = ma - mi;
ans = numm;
// cout << ans << "\n";
}
return ;
}
if(ok1 && ok2){
dfs(x + 1, l, ok1, ok2, ma, mi, numm * 10 + ma);
return ;
}
for(int i = ((ok1 == 0) ? max(v2[x], 0ll) : 0); i <= ((ok2 == 0) ? min(v1[x], 9ll) : 9); i++){
// cout << i << "\n";
if(x == 0 && i == 0){
continue;
}
dfs(x + 1, l, ok1 | (i != v2[x]), ok2 | (i != v1[x]), max(ma, i), min(mi, i), numm * 10 + i);
}
}
void solve(){
int n, m;
cin >> n >> m;
v1 = getLine(m);
v2 = getLine(n);
int lm = v1.size();
int ln = v2.size();
reverse(v1.begin(), v1.end());
reverse(v2.begin(), v2.end());
// cout << ln << " " << lm << "\n";
if(lm > ln){
cout << (int)powl(10, ln) - 1 << "\n";
return ;
}
if(ln == 1){
cout << n << "\n";
return ;
}
num = 10;
dfs(0, ln);
cout << ans << "\n";
v1.clear();
v2.clear();
}
signed main(){
// freopen("1.txt", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
while(t--){
solve();
}
return 0;
}