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 87Sample Output:
22932132143287
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define ROW 10004
//////////////////////////////////////////////////////////////////////
//TAKE CARE OF STRING COMPARISION
//ESPECIALLY IN CASES SUCH AS 32 321 32132 ETC
//THE KEY POINT IN COMPARISION LIES HERE: SUBSTRCT A SUBSTR FROM THE
//LONGER ONE,COMPARE THE REMAINER AND SUBSTR,IF SUBSTR CONTAIN REMAINDER
//OR REMAINDER CONTAIN SUBSTR, SUBSTRACT RECURRSIVELY UNTIL GOT THE ANSWER
//////////////////////////////////////////////////////////////////////////
using namespace std;
string str[ROW];
char * nonzero(string &str1){
char *p = &str1[0];
while(*p !='\0'){
if(*p !='0')
return p;
else
p++;
}
return NULL;
}
bool cmp1(const char *s1,const char *s2);
bool cmp(const string &s1,const string &s2){ //THE KEY TO FENTCH EVERY ELEMENT OF STRING CLAA
const char *p1=&s1[0]; //CAN BE USED LIKE THIS!!!
const char *p2=&s2[0];
return cmp1(p1,p2);
}
bool cmp1(const char *s1,const char *s2){
const char *p1 =s1;
const char *p2=s2;
while(*p1 != '\0' &&*p2 !='\0'){
if(*p1 == *p2){
p1++;
p2++;
}else
return *p1 <*p2;
}
if(*p1 == '\0' && *p2 != '\0'){ //s1 is short
if(*p2 !=*s1)
return *s1 < *p2;
else
return cmp1(s1,p2);
}
if(*p1 != '\0' && *p2 == '\0') //s2 is short
if(*p1 != *s2)
return *p1 < *s2;
else
return cmp1(p1,s2);
}
int main()
{
int i,N;
scanf("%d",&N);
for(i=0;i<N;i++)
cin >>str[i];
std::sort(str,str+N,cmp);
char *phead;
for(i=0;i<N;i++)
{
phead=nonzero(str[i]);
if(phead != NULL)
break;
}
if(i == N) //IF ALL ARE ZEROS, OUTPUT 0
{
cout <<0 <<endl;
return 0;
}
cout <<phead; //PRINT THE HEAD
for(i++;i<N;i++)
cout <<str[i];
return 0;
}