【算法题】幸运数字

Description

给定一个数字N,给定一个数字的集合,使用集合里的数字构造出小于数字N的最大数。

如N = 23131,集合为{2, 4, 9}

则构造出22999

Solution

分两种情况讨论,构造的数字长度和N一样,或者比N少一位,若长度一样,则是从头开始按照比数字N小的数构造,若长度少一位可以直接用集合中的最大数填满。

Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
const int MAXN = 1e5;
const int MOD = 1e9+7;
typedef long long ll;
using namespace std;
// 23131
// 2 4 9
// 22999
// 229
// 2
// 22
int N, x;
vector<int> nums;
vector<int> v;
int maxv = -1;

int main() {
    cin >> N;
    v.clear();
    nums.clear();
    while (cin >> x) {
        v.push_back(x);
        maxv = max(maxv, x);
    }
    int temp = N;
    int setNumber = v.size();
    sort(v.begin(), v.end());
    while (temp) {
        nums.push_back(temp % 10);
        temp /= 10;
    }
    reverse(nums.begin(), nums.end());
    int number = 0;
    int ans = 0;
    bool done = true;
    for (int i = 0; i < nums.size(); i++) {
        number = number*10 + nums[i];
        cout << "number = " << number << endl;
        bool find = false;
        for (int j = setNumber - 1; j >= 0; j--) {
            if (v[j] <= number) {
                ans = ans*10 + v[j];
                find = true;
                number -= v[j];
                break;
            }
        }
        if (!find) {
            done = false;
            break;
        }
    }
    cout << "size " << nums.size() << endl;
    if (!done) {
        for (int i = 0; i < nums.size() - 1; i++) {
            cout << maxv;
        }
    } else {
        cout << ans;
    }
    return 0;
}
0%