注册 登录
编程论坛 C++教室

数字积木

Julien 发布于 2015-12-01 13:49, 1105 次点击
  二、数字积木(brick.pas/c/cpp)
【问题描述】
     小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢?
     你的任务就是读入n个数字积木,求出所能形成的最大数。
【问题输入】
第一行是一个整数n (n≤1000),接下来n行每行是一个正整数。
【问题输出】
     所能形成的最大整数
【样例输入】
3
13
131
343
【样例输出】
34313131
【数据范围】
30%的数据,n≤l0,每个数<103。50%的数据,n≤l00。100%的数据,n≤1000,每个数<10200。

谁能发一下c++的参考程序
7 回复
#2
rjsp2015-12-01 14:40
程序代码:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <string>
using namespace std;

int main( void )
{
    size_t n;
    cin >> n;
    std::vector<std::string> ns;
    std::copy_n( std::istream_iterator<std::string>(cin), n, std::back_inserter(ns) );
    std::sort( std::begin(ns), std::end(ns), [](const std::string& a, const std::string& b){return a+b>b+a;} );
    std::copy( std::begin(ns), std::end(ns), std::ostream_iterator<std::string>(cout,"") );
    return 0;
}
#3
Julien2015-12-02 13:00
能说一下大概思路吗
#4
Julien2015-12-02 13:36
二、数字积木(brick.pas/c/cpp)
    算法分析:
    本题每个数都比较大,所以用字符串操作。
    朴素算法是求出所有排列,求出其中能拼成的最大值,这样能拿30分左右。
    一种贪心策略是单纯地比较字符串间的大小,把大的放在前面。但很快就能发现反
例,例如:“131”>“13”,但“13113”<“13131”。那我们再考虑一下拼接后的情况,在操作时,将单纯地比较字符串大小变成比较“拼接”后的字符串大小就可以了。例如:比较131和13,因为“13113”<“13131”,所以13应该比131大,应排在131前面。
    所以只有用一个排序算法,把两个字符串的大小比较改为“拼接”后的字符串大小比
较就行了。
能分析一下吗
#5
须臾以南2015-12-02 13:50
可以的!!!!!!!
#6
须臾以南2015-12-02 13:52
用string输入字符串,直接相加两两比较,如果小于就交换两数位置。最后输出
#7
Julien2015-12-02 16:34
明白了,谢谢
1