题目A1038 Recover the Smallest Number
-
题意
根据输入的n
个数字片段,组合成一个最小的数。 -
思路
这里一开始简单的想法是按字符串从小到大排序就好了,但是根据示例中321
在32
前面来看不是这样的。策略应该是s1 + s2 < s2 + s1
则s1
排在前面,可自行证明。然后拼起来的字符串去掉前缀0
后判断输出内容即可。
注意:
需要处理掉前缀0
,长度为0
后输出0
。
- Code in C++
#include <string>
#include <iostream>
#include <algorithm>
const int maxn = 10001;
std::string str[maxn];
bool cmp(const std::string &a, const std::string &b)
{
return a+b < b+a ;
}
int main()
{
int n;
std::cin >> n;
for (int i = 0; i < n; ++i)
{
std::cin >> str[i];
}
std::sort(str, str + n, cmp);
std::string ans="";
for (int i = 0; i < n; ++i)
{
ans += str[i];
}
// 去除前导0
while(ans.size()!=0 && ans[0] == '0')
{
ans.erase(ans.begin());
}
// 如果size为0,则输出0
std::cout << (ans.size() == 0 ? "0" : ans);
return 0;
}
小结
感觉自己还是没有掌握贪心的套路,现在有点野路子,看了一下紫书上这一块总结的内容好像和这个题目也不一样。所以接下来打算去知乎上搜搜系统训练code能力的方法,改变一下策略了。也算是这一段时间训练的一点小的反思吧。
这一题是这一小节内容的完结~