1038. Recover the Smallest Number (30)

1038. 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

题目地址:http://www.patest.cn/contests/pat-a-practise/1038


ac代码:

// 
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <iterator>
using namespace std ;

#define INF  999999
#define N 105

int n ;
vector<string> vt ;

bool cmp(string s1 , string s2)
{
	string sum1 = s1 + s2 ;
	string sum2 = s2 + s1 ;
	return sum1 < sum2 ;
}

int main()
{
	//freopen("in.txt","r",stdin);
	string stmp ;
	int i ;
	scanf("%d" , &n) ;
	for( i = 0 ;i < n ; i++)
	{
		cin >> stmp ;
		vt.push_back(stmp);
	}
	sort(vt.begin() ,  vt.end() , cmp);

	string ss = "";
	for(i = 0 ; i < n ; i++) // 先直接把 所有的字符一次加起来
	{
		ss += vt[i] ;
	}
	if(ss.find_first_not_of("0") == string::npos) // 如果是全零的 直接输入一个零
	{
		printf("0");
	}else{ //否则  Do not output leading zeros. 
		int len = ss.size() ;
		i = 0 ;
		while(ss[i++] == '0') ;
		i = i - 1 ;
		for( ; i < len; i++)
		{
			printf("%c" , ss[i]) ;
		}
	}
	printf("\n") ;
	return 0 ;
}


你可能感兴趣的:(1038. Recover the Smallest Number (30))