zoukankan      html  css  js  c++  java
  • 拼数(C++)

    问题:

    设有n个正整数,将他们排成一排,组成一个最大的多位整数。

     

    INPUT:

    第一行,正整数的个数n

    第二行,n个正整数

     

    OUTPUT:

    一个正整数,表示最大的整数。

     

    输入样例:

    3

    13 312 343

     

    样例输出:

    34331213

     

    思路:

    如果我们把每个输入的正整数当作正数来处理的话,

    我们会发现我们很难处理。

    因为存在情况一个数是另一个数的前缀的情况。

    这个时候不知道要比较多少位。

    比如说,4个正整数 756  212 2123 21231.

    这时就很麻烦。

    而如果我们把这些数字当作字符串来处理的话,过样例是没问题,

    但是对于我刚刚给出那个输入可能就会出错。

    因为字符串比较大小的时候不是看数的大小,而是看首字符的大小,依次递推。

    比如说:

    2123

    21231

    首字符相同,第二,三,四字符相同,那么就比较第五个字符,其中321第三个字符为1,而32没有,

    所以字符串比较的时候,21231就在2123前面,而我们需要的是2123在21231前面。

    这个时候需要我们自定义一种新的大小比较方式。

    即:IF A+B>B+A , A>B.

    如何证明呢?这里引用一下dmy大佬的作业题解:

    然后我们对输入这些字符串进行排序,从大到小输出字符串,即可输出最大正整数。

    代码如下

     1 #include<bits/stdc++.h>  //这个头文件包含了C++所有头文件
     2 using namespace std;
     3 int main()
     4 {
     5     int n;
     6     cin>>n;
     7     string t1,t2,a[n];
     8     for (int i = 0; i < n; i++) cin>>a[i];
     9     for (int i = 0; i < n-1; i++)  //为了简便明了,用选择排序
    10     {
    11         for (int j = i+1; j < n; j++)
    12         {   //if a+b>b+a,a>b
    13             t1=a[i]+a[j];
    14             t2=a[j]+a[i];
    15             if (t1<t2) swap(a[i],a[j]); //swap()函数在std命名空间里
    16         }
    17         
    18     }
    19     for(int i=0;i<n;i++) cout<<a[i];
    20     return 0;   
    21 }
  • 相关阅读:
    azure虚拟机创建后如何ssh私钥连接
    VisualStudio在本地创建新解决方案后如何推送到devops
    【转载】sar命令详解
    【转载】Redis【入门】就这一篇!
    【转载】算法复杂度解析,何为O()
    centOS data格式文件
    linux centOS命令整理
    机器学习中评估计算:PR,ROC,AUC计算方法
    Python中中文输出显示以及列表初始化坑坑
    SKLearn中模型持久化
  • 原文地址:https://www.cnblogs.com/Arthas8086/p/12057032.html
Copyright © 2011-2022 走看看