zoukankan      html  css  js  c++  java
  • 1038. Recover the Smallest Number (30)

    题目链接: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陈小旭

  • 相关阅读:
    Qt应用如何发布
    关于在windows下部署发布QT程序的总结
    干净地发布QT程序
    解析 Qt 程序在Windows 下发布
    Qt 5.2.0 和 VS 2012集成
    Unable to find a qt build, to solve this problem specify a qt build
    运行python程序不显示cmd的方法
    py2exe使用方法
    python 类
    在Pygtk和Glade使用Gtkbuilder
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6718851.html
Copyright © 2011-2022 走看看