PTA甲级——1038

1038 Recover the Smallest Number

Given a collection of number segments, you are supposed to recover the smallest number from them. For example, given { 32, 321, 3214, 0229, 87 }, we can recover many numbers such like 32-321-3214-0229-87 or 0229-32-87-321-3214 with respect to different orders of combinations of these segments, and the smallest number is 0229-321-3214-32-87.

Input Specification:

Each input file contains one test case. Each case gives a positive integer N (≤104) followed by N number segments. Each segment contains a non-negative integer of no more than 8 digits. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the smallest number in one line. Notice that the first digit must not be zero.

Sample Input:

1
5 32 321 3214 0229 87

Sample Output:

1
22932132143287

思路

​ 大致题意:给你一些数,然后将他们组合起来找到数最小的情况。

​ 思路:一种贪心的做法,保证小的组合一定在前面。

代码

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
#include <iostream>
#include <algorithm>

using namespace std;
const int N = 1e4 + 10;
string a[N];

// 贪心的体现,可以很好现实cmp函数的强大性
bool cmp(string a,string b) {
return a + b < b + a;
}
int main()
{
int n, x = 0, y = 0;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1, cmp);
bool flag = false;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < a[i].length(); j++) {
if (a[i][j] != '0') {
x = i;
y = j;
flag = true;
break;
}
}
if (flag) break;
}
if (x == 0 && y == 0){
cout << "0";
return 0;
}
for (int j = y; j < a[x].length(); j++) cout << a[x][j];
for (int i = x + 1; i <= n; i++) {
for (int j = 0; j < a[i].length(); j++) cout << a[i][j];
}
return 0;
}