PATA1038.RecovertheSmallestNumber(30)

coding

原文链接: PAT A1038. Recover the Smallest Number (30)

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;

}

以上是 PATA1038.RecovertheSmallestNumber(30) 的全部内容, 来源链接: utcz.com/z/509284.html

回到顶部