【CJOJ P1957】【NOIP2010冲刺十模拟赛】数字积木

来源:互联网 发布:小说阅读网软件 编辑:程序博客网 时间:2024/06/10 12:08

【NOIP2010冲刺十模拟赛】数字积木

http://oj.changjun.com.cn/problem/detail/pid/1957

Description

小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢? 你的任务就是读入n个数字积木,求出所能形成的最大数。

Input

共N+1行。
第一行是一个整数n,接下来n行每行是一个正整数

Output

一个整数,为所能形成的最大整数。

样例输入

3
13
134
343

样例输出

34313413

数据范围

对于30%的数据,n<=10,每个数<=10^3。
对于50%的数据,n<=100。
对于100%的数据,n<=1000,每个数<=10^200。

题解

这题其实不难,如果只用贪心的话也可以得到30分。当然,这题就是按照某一种方法来对这些读入的进行排序,数据又不大,直接写冒泡排序就行,所以只要自己写比较函数cmp即可AC。现在我们来看怎么写比较函数。也很简单,只要把两个待比较的串分别加在各自的后面,使得它们的长度相等,然后一位一位比较大小即可,所以程序也非常简短。

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>using namespace std;bool cmp(string c,string s){        char ch;        int l;        string bc,bs;        bc=c+s;        bs=s+c;        if(bc>bs)return true;         else return false; }//比较函数,只需要把两个待比较的串放在各自的后面然后比较大小就行了int n;string s[1001];int main(){        cin>>n;        for(int i=1;i<=n;++i)             cin>>s[i];                        //读入部分         for(int i=1;i<=n;++i)             for(int j=i+1;j<=n;++j)                    if(!cmp(s[i],s[j]))swap(s[i],s[j]);                     //排序部分,就是简单的冒泡        for(int i=1;i<=n;++i)              cout<<s[i];        cout<<endl;        return 0;   }
0 0
原创粉丝点击