PAT A1038. Recover the Smallest Number (30)
PAT A1038. Recover the Smallest Number (30)

PAT A1038. Recover the Smallest Number (30)
• 发表于 1年前
• 阅读 7
• 收藏 0
• 评论 0

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 (<=10000) 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. Do not output leading zeros.

Sample Input:

`5 32 321 3214 0229 87`

Sample Output:

`22932132143287`

给出若干可能含有前导0的数字串,将他们按照某个顺序拼接,使得生成的数字最小

对数字串s1和s2,如果 s1+s2 < s2+s1那么就将s1放在s2的前面,否则把s2放在s1的前面

``````#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>

using namespace std;
const int MAX = 10010;
string str[MAX];

//如果a+b < b+a 就把a排在前面

int cmp(string a, string b) {
return a + b < b + a;
}
int main(int argc, char *argv[]) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
cin >> str[i];
sort(str, str + n, cmp);
string ans;
for (int i = 0; i < n; i++)
ans += str[i];
int i = 0;
while (i < ans.size() - 1 && ans[i] == '0')i++;
while (i < ans.size())
printf("%c", ans[i++]);
printf("\n");
return 0;
}``````

×