51nod 1097 拼成最小的数 思维题 t1+t2<t2+t1

来源:互联网 发布:ubuntu 休眠 编辑:程序博客网 时间:2024/04/30 14:45
设有n个正整数,将它们联接成一排,组成一个最小的多位整数。

例如:
n=2时,2个整数32,321连接成的最小整数为:32132,
n=4时,4个整数55,31,312, 33 联接成的最小整数为:312313355
Input
第1行:1个数N。(2 <= N <= 10000)第2 - N + 1行:每行1个正整数。(1 <= A[i] <= 10^9)
Output

输出拼在一起的最小整数。由于数据量太大,请以1000个字符为单位,输出到一行里,最终剩余的不足1000个字符的部分,输出到单独1行。



这道题学到一点。

31和312该如何搭配使得数最小呢?

如果只是简单的排序是不对的。

我们应该

bool cmp(string t1,string t2)

{

return t1+t2<t2+t1

}


比较他们两个连接起来的值

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<algorithm>
#include<stack>
#include<math.h>
using namespace std;
string str[11000];
bool cmp(string t1,string t2)
{
    return t1+t2<t2+t1;
}
int main()
{
   int n;
   cin>>n;
   for(int i=0;i<n;i++)
   {
       cin>>str[i];
   }
   sort(str,str+n,cmp);
   string st=str[0];
   for(int i=1;i<n;i++)
   {
       st+=str[i];
   }
   int lenn=st.length();
   for(int i=0;i<lenn;i++)
   {
       if(i%1000==0&&i!=0)
       {
           cout<<endl;
       }
       cout<<st[i];
   }


   cout<<endl;
}

原创粉丝点击