zoukankan      html  css  js  c++  java
  • 1038 Recover the Smallest Number

    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 (≤) 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. Notice that the first digit must not be zero.

    Sample Input:

    5 32 321 3214 0229 87
    
     

    Sample Output:

    22932132143287

    题意:

      给出一组数字,找出由这组数字组合形成的最小字符串。

    思路:

      先将这些数字按照字符串排序,然后依次输出,如果当前字符串和下一个字符串的子串相等,则比较下一个字符串的第一个字符和第len(current string)个字符的大小,输出较小的那个。然后将这个字符标记为已经访问过。下次循环再找出没有访问过的最小的字符串。

    Code:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int main() {
     6     int n;
     7     cin >> n;
     8     vector<string> v(n + 1);
     9     vector<bool> used(n, false);
    10     for (int i = 0; i < n; ++i) cin >> v[i];
    11     sort(v.begin(), v.begin() + n);
    12     v.push_back("999999999");
    13     string res;
    14     int cnt = 0, i = 0, j;
    15     while (cnt < n) {
    16         j = i + 1;
    17         while (used[j]) ++j;
    18         int len = v[i].length();
    19         if (v[i] == v[j].substr(0, len)) {
    20             if (v[j][0] < v[j][len]) {
    21                 res += v[i];
    22                 used[i] = true;
    23                 while (used[i]) ++i;
    24             } else {
    25                 res += v[j];
    26                 used[j] = true;
    27             }
    28         } else {
    29             res += v[i];
    30             used[i] = true;
    31             while (used[i]) ++i;
    32         }
    33         cnt++;
    34     }
    35     int start = 0;
    36     while (res[start] == '0') start++;
    37     if (start == res.length()) cout << 0 << endl;
    38     else cout << res.substr(start) << endl;
    39     return 0;
    40 }

    注意:

      如果结果是0的话需要进行特殊判断。不然的话会卡第三组数据。

  • 相关阅读:
    禅道导出的CSV文件打开为乱码的解决方法
    谈谈微信支付曝出的漏洞
    阿里云ACE深圳同城会 开始报名
    CSS 埋点统计
    How to use “svn add” recursively in Linux shell?
    Java反序列化漏洞执行命令回显实现及Exploit下载
    在线测试 ssl 安全性
    检测一下你的专业指数:2015年十大测试工具你认识几个?
    nginx用户认证配置( Basic HTTP authentication)
    FTP基础知识 FTP port(主动模式) pasv(被动模式) 及如何映射FTP
  • 原文地址:https://www.cnblogs.com/h-hkai/p/12876013.html
Copyright © 2011-2022 走看看