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;
}
|