CF915C Permute Digits

思路:

从左到右贪心放置数字,要注意判断这个数字能否放置在当前位。

实现:

 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 }
原文地址:https://www.cnblogs.com/wangyiming/p/8379981.html