题目描述
设有 n 个正整数a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 n。
第二行有 n 个整数,表示给出的 n 个整数 ai。
输出格式
一个正整数,表示最大的整数
输入输出样例
输入 #1复制
3 13 312 343
输出 #1复制
34331213
输入 #2复制
4 7 13 4 246
输出 #2复制
7424613
说明/提示
对于全部的测试点,保证 1≤n≤20,1≤ai≤109。
NOIP1998 提高组 第二题
#一开始还以为只用将每部分从大到小排序再拼接即可,但是实际上是不对的
s=''
n=int(input())
arr=list(map(str,input().split()))
# print(sorted(arr,reverse=True))
for i in sorted(arr,reverse=True):
s+=i
print(s)
此题很容易想到使用贪心法,把整数按从大到小的顺序连接起来,测试题目的例子也都符合,但最后测试的结果却不全对。按这种标准,我们很容易找到反例:12,121应该组成12121而非12112,那么是不是相互包含的时候就从小到大呢?也不一定,如12,123就是12312而非12123,这种情况就有很多种了。
其实此题可以用贪心法来求解,只是刚才的标准不对,正确的标准是:先把整数转换成字符串,然后在比较a+b和b+a,如果a+b>=b+a,就把a排在b的前面,反之则把a排在b的后面。
def swap(i,j):
return j,i
n=int(input())
arr=list(map(str,input().split()))
s=''
for i in range(n-1):
for j in range(i+1,n):
if arr[i]+arr[j]<arr[j]+arr[i]: #若a+b<b+a则互换a,b的位置
arr[i],arr[j]=swap(arr[i],arr[j])
# print(arr)
for i in arr:
s+=i
print(s)