题目粗心:
给出若干可能有前导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;}