思路:
从左到右贪心放置数字,要注意判断这个数字能否放置在当前位。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int cnt[11], buf[11]; 5 6 bool check(ll t, ll b) 7 { 8 memcpy(buf, cnt, sizeof(int) * 11); 9 for (int i = 0; i <= 9; i++) 10 { 11 while (buf[i]) { t *= 10; t += i; buf[i]--; } 12 } 13 return t <= b; 14 } 15 16 int main() 17 { 18 string a, b; 19 while (cin >> a >> b) 20 { 21 int x = a.length(), y = b.length(); 22 for (int i = 0; i < 11; i++) cnt[i] = 0; 23 for (int i = 0; i < x; i++) cnt[a[i] - ‘0‘]++; 24 ll ans = 0; 25 bool flg = x < y ? true : false; 26 for (int j = y - 1; j > y - x - 1; j--) 27 { 28 int k = flg ? 9 : b[y - 1 - j] - ‘0‘; 29 for (; k >= 0; k--) 30 { 31 if (!cnt[k]) continue; 32 cnt[k]--; 33 if (check(ans + k, stoll(b))) 34 { 35 ans += k; 36 if (k < b[y - 1 - j] - ‘0‘) flg = true; 37 if (j != y - x) ans *= 10; 38 break; 39 } 40 cnt[k]++; 41 } 42 } 43 cout << ans << endl; 44 } 45 return 0; 46 }