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

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

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;	
}
原文地址:https://www.cnblogs.com/cjyyb/p/7196596.html