题目大意:
给出若干可能有前导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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。