标签:
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 <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string>
#pragma warning(disable:4996)
using namespace std;
struct Num {
string s;
char c[8];
};
vector<Num> num;
bool cmp(Num a, Num b) {
for (int i = 0; i < 8; i++) {
if (a.c[i] < b.c[i]) {
return true;
}
else if(a.c[i] > b.c[i]){
return false;
}
}
return true;
}
bool CheckInput(string s) {
for (int i = 0; i < s.length(); i++) {
if (s[i] != ‘0‘)
return true;
}
return false;
}
int main(void) {
int n;
cin >> n;
/*char chartemp;
scanf("%c", &chartemp);*/
Num numtemp;
for (int i = 0; i < n; i++) {
cin >> numtemp.s;
if (!CheckInput(numtemp.s))
continue;
for (int i = 0; i < 8; i++) {
numtemp.c[i] = numtemp.s[i % (numtemp.s.length())];
}
num.push_back(numtemp);
}
if (num.size() == 0) {
cout << "0";
return 0;
}
sort(num.begin(), num.end(), cmp);
for (int i = 0; i < num.size(); i++) {
if (i == 0) {
bool flag = false;
for (int j = 0; j < num[i].s.length(); j++) {
if (num[i].s[j] != ‘0‘)
flag = true;
if (flag == true)
cout << num[i].s[j];
}
}
else
cout << num[i].s;
}
return 0;
}
1038. Recover the Smallest Number (30)
标签:
原文地址:http://www.cnblogs.com/zzandliz/p/5023132.html