关于算法-数据结构:PAT甲级1038-Recover-the-Smallest-Number

36次阅读

共计 821 个字符,预计需要花费 3 分钟才能阅读完成。

题目粗心:

给出若干可能有前导 0 的数字串,将它们按某个程序拼接,使得生成的数最小。

算法思路:

这个题要求一堆数字串拼接取得最小的数字,那么对于其部分问题就是有 2 个数字串,如何拼接使其最小,答案就是先将其 2 种可能拼接进去比拟其大小即可,而数字的大小其实和转化为字符串的大小比拟是统一的,而且对于拼接操作指的基本上就是字符串操作。那么也即是对于这样一堆数字串转为字符串,而后对于任意 2 个字符串 a 和 b 的拼接后的数字最小值转化为其字符串拼接后的最小值 (后果字典序最小),而后以此类推,拼接好的字符串于另外一个字符串造成新的 2 个字符串的拼接比拟操作。这样就由部分最优推导出全局最优解。具体操作为应用字符串数组 s 存储所有的字符串,应用 sort 函数依据字符串拼接后果字典序从小到大排序,而后应用 result 将所有的字符串拼接起来,去除前导 0 输入即可。对于字符串全副为 0 的要特判输入数字 0.

提交后果:

AC 代码:

#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>

using namespace std;

bool cmp(const string& a,const string& b){return a+b<b+a;}

int main(){
    int N;
    scanf("%d",&N);
    string s[N];
    for (int i = 0; i < N; ++i) {cin>>s[i];
    }
    sort(s,s+N,cmp);
    string result;
    for (int i = 0; i < N; ++i) {result += s[i];
    }
    if(result.find_first_not_of('0')==string::npos){
        // 没有不为 0 的数字, 阐明数字都为 0,输入 0,测试点 2 考查
        cout<<0;
    } else{cout<<result.substr(result.find_first_not_of('0'));
    }
    return 0;
}

正文完
 0