Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55058
  • 博文数量: 12
  • 博客积分: 480
  • 博客等级: 下士
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-15 13:42
文章分类
文章存档

2010年(3)

2009年(2)

2008年(7)

我的朋友

分类:

2009-06-05 11:28:24

题目描述:设有n个正整数,将它们联接成一排,组成一个最小的多位整数。
程序输入:n个数程序输出:联接成的多位数
例如:n=2时,2个整数32,321连接成的最小整数为:32132,n=4时,4个整数55,31,312, 33 联接成的最小整数为:312313355
[题目要求]1. 给出伪代码即可,请给出对应的文字说明,并使用上面给出的例子试验你的算法。2. 给出算法的时间空间复杂度。3. 证明你的算法。(非常重要)
------------------------------------------------
开始一直在想有没有什么取巧的简单方法,结果搞不定,后来想想还是按排序来吧,容易证明
方法就是把数字做为字符串来排序,排序的比较原则是:两个数字串A,B,如果AB < BA,则A < B
首先证明方法正确性:如果A小于其他所有数字串,则A应该在最前面
假设某个A在中间的连接小于以A开头的连接,则为.....MA....,因为AM < MA,所以AM.... < MA....,
所以把MA换成AM会变小。同理可知把A移到开头最小。
然后具体比较方法:比较字符串的连接
ab|adcde
abcde|ab
拿abcdeab和abcdeab比较
 
代码:
#include
#include
#include
#include
using namespace std;
int main()
{
    string num;
    vector v;
    while(cin>>num) {
        v.push_back(num);
    }
    sort(v.begin(), v.end(), [](const string& s1, const string& s2) -> bool {
        return (s1+s2).compare(s2+s1) < 0;
    });
    for_each(v.begin(), v.end(), [](string s) { cout << s; });
    cout << endl;
   
    return 0;
}
阅读(525) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~