zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    content type
    存储过程查询并插入到临时表
    jdk 生成证书
    sql 表值函数-将一个传入的字符串用2中分隔符拆分成临时表
    sql 把一个用逗号分隔的多个数据字符串变成一个表的一列
    sql 分隔字符串函数
    md5 加密
    SQL语句的使用
    WINDOW的cmd的命令【转载】
    zookeeper安装
  • 原文地址:https://www.cnblogs.com/yangqingli/p/4865731.html
Copyright © 2011-2022 走看看