题目描述
题目大意:给一些字符串,求它们拼接起来构成最小数字的方式
知识点
贪心思想+排序
实现
码前思考
-
这道题目我真就一开始啥都没想到,我还想了一种特别特别复杂的方法,最后放弃了,选择看柳神的代码。。。
-
分析:贪心算法。让我们一起来见证
cmp
函数的强大之处!!不是按照字典序排列就可以的,必须保证两个字符串构成的数字是最小的才行,所以cmp
函数写成return a + b < b + a;
的形式,保证它排列按照能够组成的最小数字的形式排列。因为字符串可能前面有0,这些要移除掉(用
s.erase(s.begin())
(通过迭代器进行删除)就可以了。嗯,string
如此神奇~~~)。输出拼接后的字符串即可。注意:如果移出了0之后发现s.length() == 0了,说明这个数是0,那么要特别地输出这个0,否则会什么都不输出~
代码实现
//采用cmp函数进行实现
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = 1e4+10;
string input[maxn];
int n;
//超级nice
bool cmp(string a,string b){
return a+b<b+a;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>input[i];
}
//然后进行排序
sort(input,input+n,cmp);
string output;
for(int i=0;i<n;i++){
output+=input[i];
}
//寻找第一个非0的元素
int idx=0;
for(;idx<output.size();idx++){
if(output[idx] != '0'){
break;
}
}
//注意特判0
if(idx == output.size()){
cout<<0;
}else{
cout<<output.substr(idx);
}
return 0;
}
码后反思
- 我好菜,要继续加油。5天不写题,我就菜成这个样子了。