现在的位置: 首页 > 综合 > 正文

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

2017年11月16日 ⁄ 综合 ⁄ 共 1994字 ⁄ 字号 评论关闭

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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;
}


【上篇】
【下篇】

抱歉!评论已关闭.