[NOIP1998]最大数

 1998年NOIP全国联赛提高组

题目描述

设有n个正整数 (n<=20), 将它们连接成一排,  组成一个最大的多位整数.
例如: n=3时, 3个整数13, 312, 343连接成的最大整数为: 34331213
又如: n=4时, 4个整数7,13,4,246连接成的最大整数为: 7424613

输入输出格式

输入格式:


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.
View Code

  当然还是有正规做法的:其实这一题的关键就是巧妙地运用排序和字符串的特性即可以轻松通过了字符串的特性是什么呢?就是字符串在相加时,比如‘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.
View Code

 

转载于:https://www.cnblogs.com/yangqingli/p/4865731.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值