zoukankan      html  css  js  c++  java
  • 与班尼特·胡迪一起找简单规律(HZOJ-2262)

    与班尼特·胡迪一起找简单规律

    Time Limit:  1 s      Memory Limit:   256 MB

    Description

    班尼特·胡迪发现了一个简单规律

    给定一个数列,1 , 11, 21, 1211,1231 , 131221……,其规律如下:

    1(首项),

    前一项 “1” 中有1个1   -> 所以第二项为 11,

    前一项 “11”中有2个1   ->所以第三项为  21,

    前一项 “21”中有1个2,1个1  -> 所以第四项为1211,

    1个2,3个1  -> 1231 ,

    1个3,1个2,2个1 -> 131221,

    ……

    现在,给你首项 n ,请输出数列中第m个数,0<m<1000000, m的总和不超过 1.1×10^6 ,n的长度不超过1000000.

    Input

    多组输入,每行输入两个自然数,n和m。

    Output

    每行输出一个答案。

    Samples

    input:
    1  6
    output:
    131221

    Author

    Source

    杭州师范大学第十一届程序设计竞赛

    题解:统计一个数字出现的次数,然后次数+数字从大到小输出。

    思路:这边要注意n的长度是0-1000000,注意不是大小!!!读入要用字符串读入。然后算m-1次。

    贴一下我自己补的代码。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<iostream>
     6 using namespace std;
     7 int a[1000000];
     8 int num[10];
     9 int main()
    10 {
    11     char n[1000000];
    12     int m;
    13     int l,i,numble;
    14     while(scanf("%s %d",&n,&m)!=EOF)                 //读入数据
    15     {
    16         l=strlen(n);                                 //字符串长度
    17         for(i=0;i<l;i++)                          //倒着读入
    18         {
    19             a[i]=n[i]-'0';                       //存数字
    20         }
    21         m=m-1;
    22         while(m--)                        //循环m-1遍
    23         {
    24             memset(num,0,sizeof(num));            //清空一次每个数字出现几次
    25             for(i=0;i<l;i++)
    26             {
    27                 num[a[i]]++;                     //计算每个数字出现的次数
    28             }
    29             l=0;                              //清空长度
    30             for(i=0;i<=9;i++)
    31             {
    32                 if(num[i]>0)                 //从0开始,如果该数据出现了
    33                 {
    34                     a[l++]=i;                //第一个输入是什么数字
    35                     while(num[i]>0)
    36                     {
    37                         a[l++]=num[i]%10;       //第二个计算出现的次数,大于10要逐个取出来
    38                         num[i]/=10;
    39                     }
    40                 }
    41             }
    42         }
    43         for(i=l-1;i>=0;i--)
    44         {
    45             printf("%d",a[i]);            //要从大到小输出
    46         }
    47         printf("
    ");
    48     }
    49     system("pause");
    50     return 0;
    51 }

     贴一下出题人美丽的代码:https://paste.ubuntu.com/26264736/

  • 相关阅读:
    poj 1579(动态规划初探之记忆化搜索)
    hdu 1133(卡特兰数变形)
    CodeForces 625A Guest From the Past
    CodeForces 625D Finals in arithmetic
    CDOJ 1268 Open the lightings
    HDU 4008 Parent and son
    HDU 4044 GeoDefense
    HDU 4169 UVALive 5741 Wealthy Family
    HDU 3452 Bonsai
    HDU 3586 Information Disturbing
  • 原文地址:https://www.cnblogs.com/Tangent-1231/p/8127474.html
Copyright © 2011-2022 走看看