您的位置:首页 > 编程语言 > C语言/C++

1038. Recover the Smallest Number (30)

2016-12-01 21:41 302 查看


1038. Recover the Smallest Number (30)

时间限制

400 ms

内存限制

65536 kB

代码长度限制

16000 B

判题程序

Standard

作者

CHEN, Yue

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

剑指offer,Q33

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 10010

char s[MAX][10];
char s1[30];
char s2[30];

int cmp(const void *a, const void *b)
{
strcpy(s1, (const char *)a);
strcat(s1, (const char *)b);
strcpy(s2, (const char *)b);
strcat(s2, (const char *)a);
return strcmp(s1, s2);
}

int main()
{
int N, i, j;
int flag;
//freopen("d:\\input.txt", "r", stdin);
scanf("%d", &N);
for (i = 0; i < N; ++i)
{
scanf("%s", s[i]);
}
qsort(s, N, sizeof(s[0]), cmp);
flag = 0;
for (i = 0; i < N; i++)
{
for (j = 0; s[i][j] != 0; j++)
{
if (s[i][j] != '0')
{
flag = 1;
break;
}
}
if (flag)
{
break;
}
}
if (!flag)
{
puts("0");
return 0;
}
printf("%s", s[i] + j);
for (i = i + 1; i < N; ++i)
{
printf("%s", s[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息