九度oj 1504:把数组排成最小的数 (贪心)

来源:互联网 发布:微商和淘宝哪个好 编辑:程序博客网 时间:2024/06/02 19:08

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

      输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,其中每个正整数不超过10000000(10^7)。

注意这几组测试数据:

2

34  343----->34334

43 434---->43434

思路:1.每一次从右边取最小的数字,用结构体用存数据

           2.如何相等 例如23232301和23,把23的arr[]补全为:23232323,再比较

           3.仍然相等例如 34 和343,则把枚举 34343和34334 再比较 

复杂度O(7*n^2)


#include<iostream>#include<cstdio>#include<memory.h>using namespace std;struct node{   int num;   int arr[20];//把数每一位都分解 放进arr[]  例如123,arr[]={1,2,3};   int length;//num的位数   bool isAppear;//是否已经输出};int main(){    int n;    node myArr[110];    while(scanf("%d",&n)!=EOF)    {        memset(myArr,0,sizeof(myArr));        for(int i=1;i<=n;i++)        {            scanf("%d",&myArr[i].num);            int temp=myArr[i].num;            int arr[10];            int index=0;            while(temp!=0)            {                arr[++index]=temp%10;                temp/=10;            }            myArr[i].length=index;            for(int j=1;j<=index;j++)            {                myArr[i].arr[index-j+1]=arr[j];/**  1-index  */            }        }        int ans;        for(int i=1;i<=n;i++)        {            ans=-1;            for(int j=1;j<=n;j++)            {               if(myArr[j].isAppear==false)               {                   if(ans==-1)                   {                       ans=j;                   }                   else                   {                       int length=myArr[ans].length>myArr[j].length?myArr[ans].length:myArr[j].length;                       int smallNo=myArr[ans].length<myArr[j].length?ans:j;//长度较小的数字那个序号                       for(int k=myArr[smallNo].length+1;k<=length;k++)///23232301 23,把较短的数字的arr[]补全                       {                                              //例如23补成23232323                           if(k%myArr[smallNo].length==0)                              myArr[smallNo].arr[k]=myArr[smallNo].arr[myArr[smallNo].length];                          else                             myArr[smallNo].arr[k]=myArr[smallNo].arr[k%myArr[smallNo].length];                       }                       for(int k=1;k<=length;k++)//每一次选择最小的那个数 输出                       {                           if(myArr[ans].arr[k]<myArr[j].arr[k])                           {                               break;                           }                           else if(myArr[ans].arr[k]>myArr[j].arr[k])                           {                               ans=j;                               break;                           }                           if(k==length)/**23和231--23123,23和234-23234  */                           {                               long long sum1=0;                               for(int t=1;t<=myArr[ans].length;t++)                               {                                   sum1=sum1*10+myArr[ans].arr[t];                               }                               for(int t=1;t<=myArr[j].length;t++)                               {                                   sum1=sum1*10+myArr[j].arr[t];                               }                                long long sum2=0;                                for(int t=1;t<=myArr[j].length;t++)                               {                                   sum2=sum2*10+myArr[j].arr[t];                               }                               for(int t=1;t<=myArr[ans].length;t++)                               {                                   sum2=sum2*10+myArr[ans].arr[t];                               }                               if(sum1>sum2)                               {                                   ans=j;                               }                               //printf("sum1=%lld***sum2=%lld\n",sum1,sum2);                           }                       }                   }               }            }            printf("%d",myArr[ans].num);            myArr[ans].isAppear=true;        }        printf("\n");    }    return 0;}