1038. Recover the Smallest Number (30)

来源:互联网 发布:淘宝会员登录 编辑:程序博客网 时间:2024/04/29 08:08

题目链接:http://www.patest.cn/contests/pat-a-practise/1038

题目:

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

分析:

输出几个数字字符串,输出其组合数的最小值,最简单的当然是穷举然后排序了,但是太暴力了,我们要反对暴力。

应该先对字符串进行一个排序,然后直接组合后输出即可。这里的比较函数是一个难点。

注意到234<2343, 234 > 2341,所以如果两个字符串比较,较短字符串比较完后还要进行循环比较直到较长字符的末尾(即要取%接着比较)

要注意输入都为0的情况。也注意一下string的erase的用法

AC代码:

#include<iostream>#include<algorithm>#include<stdio.h>#include<string>#include<vector>using namespace std;vector<string>V;bool cmp1(string A, string B){//核心的比较函数 if (A.size() > B.size()){  for (int i = 0; i < A.size(); i++){   if (A[i] != B[i % B.size()])//当较短字符串比较完了之后,还要循环继续比较到较长字符串的末尾,因为234是小于2343的,但是是大于2341的。    return A[i] < B[i % B.size()];  } } else{  for (int i = 0; i < B.size(); i++){   if (A[i % A.size()] != B[i])    return A[i % A.size()] < B[i];  } }//make sure that A is no longer than B}int main(){ //freopen("F://Temp/input.txt", "r", stdin); string tmp; int n; cin >> n; for (int i = 0; i < n; i++){  cin >> tmp;  V.push_back(tmp); } sort(V.begin(), V.end(), cmp1); string str; for (int i = 0; i < V.size(); i++){  str += V[i]; } int idx = 0; while (str[idx] == '0')idx++; str.erase(0, idx);//要把首部的0给去除掉 if (str.size() == 0)cout << "0" << endl;//如果一个数字也没有,输出0 else cout << str << endl; return 0;}


截图:


——Apie陈小旭

0 0
原创粉丝点击