关押哪种拼接方式形成的数字最特别。看呀种拼接方式形成的数字最要命。

数字接力赛(FZU-1593)
 福州大学第五暨程序设计竞赛

数字接力赛(FZU-1593)
 福州大学第五届程序设计竞赛

光阴限制
1000ms 内存限制 32768KB

岁月限定
1000ms 内存限制 32768KB

问题讲述

问题讲述

叫一定两单数字,可将她拼接在一块儿形成一个新的数字,称之为数字接力。

于一定两单数字,可将她拼接在齐形成一个新的数字,称之为数字接力。

现在展开数字接力赛,给定n个数,看呀种拼接方式形成的数字最充分。例如1,2,3叔单数字,六种可能的拼接结果是:123,132,213,231,312,321。容易发觉极其深之数字是321。

今天开展数字接力赛,给定n个数,看呀种拼接方式形成的数字最可怜。例如1,2,3老三只数字,六种可能的拼凑结果是:123,132,213,231,312,321。容易发现最酷的数字是321。

输入

输入

主题有差不多组输入数据,你必须处理到EOF为止。

主题有多组输入数据,你得处理及EOF为止。

每组数据第一实践是一个正整数$n$($1≤n≤100000$)。接下来$n$行每行一个非负整数$m$
($0≤m<2^{31}$)。

每组数据第一行是一个正整数$n$($1≤n≤100000$)。接下来$n$行每行一个非负整数$m$
($0≤m<2^{31}$)。

输出

输出

出口一行,表示出于这$n$个数拼接而成为的最要命数字。

输出一行,表示出于当时$n$个数拼接而改为的尽深数字。

样例输入

样例输入

3
1
2
3
3
1
2
3

样例输出

样例输出

 321

 321

夫开要求以加以的反复拼起来,而考虑到每个数字都出或达成32各产生记号整数的大小,因此不大可能直接使用int数据类型作为结果进行仓储,即无法直接开展数字大小的可比。所以返朴归真,考虑怎样进行数字大小的比较。到问题受到是出于同的多次按不同排列方式拼接而改为,因此最终得出的累累相应长相同。设一个十上制数$A,B$分别由$n$位数码$A_1,A_2,…A_k,…A_n$,$B_1,B_2,…B_k,…B_n$构成,于是比较数$A$和数$B$的分寸,即从嵩位为低位依次比较$A_i$和$B_i$。如果$A_1=B_i$那么比$A_{i+1}$和$B_{i+1}$,直到于有大大小小为止。因此问题就转向为字符串比较的题材了。其次就是是失去解决什么拼接的问题。暴力穷举显然是不可行的,因为$n$个数字的全排列数为$n!$独,显然时间是休同意的。考虑我们得极度酷的一再,因此要求从嵩位至低于位(从左往右)尽可能的不过要命,因此不难想到利用一个排序了的数组依次从中取出最老因素构造答案。单纯极致深明确好,考虑这么平等组数:$s_1=51$,$s_2=52$
,$s_3=512$,直接用ASCII序对字符串排序,得到的凡$s_2>s_1>s_3$,即$5251251$,但是绝深的数$5251512$。问题应运而生于平等前缀但是长不平等的字串上。对于这些错直接用ASCII码进行比较,必然是长十分的差较生;而事实上我们用保证拼接后的失误进行比较,因此可自定义一个比函数,在比$s_1$和$s_2$时,对$s_1+s_2$和$s_2+s_1$进行比,从而决定在输出序列中之排序时之次位置。对于前缀不同的字串,这种比明白也是天经地义的。当打2单失误扩展至多只错,我们就欲说明排序后的输出是对的。下面用了循环不变式(类似于数学归纳法,详细描述见《算法导论》)来证实算法的不易:

这书要求将加以的多次拼起来,而考虑到每个数字还起或高达32各类产生记号整数的尺寸,因此不大可能直接动用int数据类型作为结果进行仓储,即无法直接开展数字大小的于。所以返朴归真,考虑怎样开展数字大小的可比。到问题遭受凡由同的往往准不同排列方式拼接而成为,因此最终得出的一再相应长相同。设一个十前进制数$A,B$分别由$n$位数码$A_1,A_2,…A_k,…A_n$,$B_1,B_2,…B_k,…B_n$构成,于是比较数$A$和数$B$的大小,即于最高位为低位依次比较$A_i$和$B_i$。如果$A_1=B_i$那么比$A_{i+1}$和$B_{i+1}$,直到于起大大小小为止。因此问题不怕转向为字符串比较的问题了。其次就是是失去解决什么拼接的题目。暴力穷举显然是不可行的,因为$n$个数字的全排列数为$n!$独,显然时间是未允的。考虑我们得极度深的数,因此要求自高高的位至低位(从左往右)尽可能的最为特别,因此好想到以一个排序了底数组依次从中取出最要命因素构造答案。单纯极致可怜明确十分,考虑这样同样组数:$s_1=51$,$s_2=52$
,$s_3=512$,直接用ASCII序对字符串排序,得到的凡$s_2>s_1>s_3$,即$5251251$,但是最为可怜之数$5251512$。问题应运而生于同前缀但是长不一样的字串上。对于这些错直接用ASCII码进行比,必然是长十分之错较生;而实际我们用保证拼接后底失误进行比,因此可打定义一个比函数,在比$s_1$和$s_2$时,对$s_1+s_2$和$s_2+s_1$进行较,从而决定在出口序列中之排序时的顺序位置。对于前缀不同的字串,这种比较强烈也是对的。当从2单失误扩展及大半只错,我们就是要验证排序后的输出是科学的。下面用了循环不变式(类似于数学归纳法,详细描述见《算法导论》)来证实算法的是:

1)当$n=1$时,只出一个错(原题中是数字,但是这里当做串来拍卖),直接出口显然是无与伦比要命之。

1)当$n=1$时,只出一个失误(原题中是数字,但是此间当串来处理),直接出口显然是极特别的。

2)当$n=k$时,假要这时候得到的数$A$,其数组为$A[1..k]$是按照我们预料的法门排好序的,即$A[1]A[2]..A[k]$是前$k$个要素构成的最为特别勤(这里而$A[k]$代表的凡频繁吃之平等失误数字),满足$A[1]>A[2]>…>A[k]$,那么当$n=k+1$时,对于自由的$i≤k$都出$A[k+1]<A[i]$成立,如果此刻$A[k+1]$处于$1..i$着之随机位置$p$上,而取新的数$A′$,那么用节能比较到第$p$个数时(对应数组的第$r$个元素,即数字从左往右的第$r$位,其中$r =
\sum_{n=1}^pA[n].\rm{length}$,这时显然会起$A′<A$。因此证明了$n=k+1$时也起。

2)当$n=k$时,假要这时候得到的数$A$,其数组为$A[1..k]$是按照我们预料的方法排好序的,即$A[1]A[2]..A[k]$是前$k$个因素构成的卓绝深勤(这里要$A[k]$代表的凡屡屡惨遭之平等差数字),满足$A[1]>A[2]>…>A[k]$,那么当$n=k+1$时,对于随意的$i≤k$都发生$A[k+1]<A[i]$成立,如果此刻$A[k+1]$处于$1..i$遭遇之妄动位置$p$上,而获取新的数$A′$,那么用节约比较到第$p$个数时(对应数组的第$r$个因素,即数字从左往右的第$r$位,其中$r =
\sum_{n=1}^pA[n].\rm{length}$,这时显然会发$A′<A$。因此证明了$n=k+1$时为树立。

3)当循环结束时,数组中之持有因素全部输出,已出口的素序列构成了极端酷累,因此获得了是的答案。

3)当循环结束时,数组中之享有因素全部输出,已出口的要素序列构成了极要命勤,因此获得了不错的答案。

这样尽管获取了这问题的解决智:先对输入的$n$个失误按照一定措施排序,然后照排序结果输出。整个算法的复杂度为$O(n{\rm
lg}n)$。排序可以调用STL的sort函数,其中单纯需要由定义一个比较函数mycmp.稍微提及一下sort的函数前片单参数为擅自迭代器,直接动用数组下标也是足以的。我同一开始打算用重载<运算符,但是一直使用string也不可行,便定义了一个只有string成员的struct,对struct重载<运算符,结果TLE了。后来发觉直接动用STL基本属于常数临界的状态,而struct在编译器不优化的情形增加了一样涂鸦寻址操作,也尽管是充实了常数。不过STL的string类确实简化了操作,如果未用string类,显然使用strcat后更就此strcmp写起颇麻烦。我的C++实现如下:

如此即使取得了这个题目之化解方法:先对输入的$n$个失误按照一定措施排序,然后按排序结果输出。整个算法的复杂度为$O(n{\rm
lg}n)$。排序可以调用STL的sort函数,其中只需要从定义一个比较函数mycmp.稍微提及一下sort的函数前少独参数为随意迭代器,直接行使数组下标也是可以的。我同样开始试图下重载<运算符,但是一直用string也不可行,便定义了一个只有string成员的struct,对struct重载<运算符,结果TLE了。后来意识一直采用STL基本属于常数临界的状态,而struct在编译器不优化的情形多了同样不良寻址操作,也就是是增加了常数。不过STL的string类确实简化了操作,如果非用string类,显然使用strcat后再就此strcmp写起老累。我的C++实现如下:

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 using namespace std;
 5 bool mycmp(string a, string b)
 6 {
 7     return ((a + b) > (b + a));
 8 }
 9 string src[100000];
10 int main()
11 {
12     int n;
13     while (cin >> n)
14     {
15         for (int i = 0; i < n; i++)
16             cin >> src[i];
17         sort(src, src + n, mycmp);
18         for (int i = 0; i < n; i++)
19             cout << src[i];
20         cout << endl;
21     }
22     return 0;
23 }
 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 using namespace std;
 5 bool mycmp(string a, string b)
 6 {
 7     return ((a + b) > (b + a));
 8 }
 9 string src[100000];
10 int main()
11 {
12     int n;
13     while (cin >> n)
14     {
15         for (int i = 0; i < n; i++)
16             cin >> src[i];
17         sort(src, src + n, mycmp);
18         for (int i = 0; i < n; i++)
19             cout << src[i];
20         cout << endl;
21     }
22     return 0;
23 }

p.s.leaderboard的93ms的代码应该是$O(n)$的,确实想不知晓了,我异常惊讶怎实现之。。。。。。

p.s.leaderboard的93ms的代码应该是$O(n)$的,确实想不晓得了,我那个诧异怎实现之。。。。。。