标签:
1998年NOIP全国联赛提高组
设有n个正整数 (n<=20), 将它们连接成一排, 组成一个最大的多位整数.
例如: n=3时, 3个整数13, 312, 343连接成的最大整数为: 34331213
又如: n=4时, 4个整数7,13,4,246连接成的最大整数为: 7424613
输入格式:
n
n个数
输出格式:
连接成的多位数
输入样例#1:
3 13 312 343 4 7 13 4 246
输出样例#1:
34331213
7424613
鉴于n<=20爆搜即可,主要数据范围开到long long(int64)
var a:Array[1..1000] of ansistring; f:array[1..1000] of boolean; ans,anss,n,x:int64; i:longint; function max(x,y:int64):int64; begin if x>y then exit(x) else exit(y); end; procedure dfs(x,y:longint;s:ansistring); var i,j,c:longint; begin if y=n then begin val(s,anss,c); ans:=max(ans,anss); exit; end; for i:=1 to n do if not f[i] then begin f[i]:=true; dfs(i,y+1,s+a[i]); f[i]:=false; end; end; begin fillchar(f,sizeof(f),false); ans:=0; readln(n); for i:=1 to n do begin read(x); str(x,a[i]); end; for i:=1 to n do begin f[i]:=true; dfs(i,1,a[i]); f[i]:=false; end; writeln(ans); end.
当然还是有正规做法的:其实这一题的关键就是巧妙地运用排序和字符串的特性即可以轻松通过了字符串的特性是什么呢?就是字符串在相加时,比如‘1’+‘2’他会得到‘12’,而‘2’+‘1’会得到‘21’。所以呢,利用此特性,再用选排来模拟每一种情况,就能十分容易的找出正确答案了。
var a:array[1..60000]of ansistring; b,c,d,i,j,k,l,m,n,o:longint; s,t,jia:ansistring; begin readln(n); for i:=1 to n do begin{读入,因为读入的数据中有空格,所以先读入成数字,然后再转换到字符串数组中} read(m);str(m,a[i]); end; for i:=1 to n-1 do{巧妙地运用选排} for j:=i+1 to n do begin if a[i]+a[j]<a[j]+a[i] then begin {因为字符串的特性(如下),选排会将所有的情况一一模拟,继而派出题目要求的最大数} t:=a[i]; a[i]:=a[j]; a[j]:=t;end; end; for i:=1 to n do{已经排完序后,依次输出就是正确答案了} write(a[i]); end.
标签:
原文地址:http://www.cnblogs.com/yangqingli/p/4865731.html