zoukankan      html  css  js  c++  java
  • POJ1016Numbers That Count

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6673675

     

    大致题意:

    题意不难懂,对于任意的数字串n,都可以压缩存储为

    c1 d1 c2 d2 .... ck dk 形式的数字串

    而存在一些特别的数字串,其压缩前后的样子是一模一样的

    定义这种数字串为self-inventorying

     

    当我们把n看成原串,

    A为n压缩1次后的数字串,

    B为n压缩2次后的数字串(即A压缩1次后的数字串)

    ....以此类推

    K为n压缩k次后的数字串(即K-1压缩k-1次后的数字串)

     

    则可以延伸出数字串n的3种属性:

    1、  n压缩1次就马上出现self-inventorying特性,即 n n n n n n n .....

    2、  n压缩j次后的数字串J出现self-inventorying特性,即 n A B C....H I J J J J J J J

    3、  n压缩j次后的数字串J,每再压缩K次,重新出现数字串J,即n A B... J ..K J ..K J..K J

    其中K称为循环间隔,K>=2

     

    现给定一字符串,输出其属性。  属性1优于属性2,属性2优于属性3

     

     

    解题思路:

    字符串处理,纯粹的模拟题

    压缩n时要注意,ck可能是1位,也可能是2位,需要判断。

     

    设R(n)为描述整数n的压缩数字串

     

    1、当R(n)==R(R(n))时,则n is self-inventorying

     

    2、对于整数n:

    令N = n

          for j=1 to 15

          {   令tj =R(N)

             若R(tj)== R(R(tj)) ,则n is self-inventorying after j steps 且 break

             否则  N=tj

          }

     

    3、对于整数n:

         令N = n,记录num[0]= n

         for j=1 to 15

          {       tj =R(N),记录num[j]=tj

                   for i=0 to j-2 (保证k>=2)

    {    tj== num[i] ,则n enters an inventory loop of length k ( k=j-i )

         break

    }

          }

     

    4、当且仅当n的3种属性都不存在时,n can not be classified after 15 iterations

    Source修正

    East Central North America 1998

    http://plg1.cs.uwaterloo.ca/~acm00/regional98/real/

     1 //Memory Time 
    2 //232K 32MS
    3
    4 #include<iostream>
    5 #include<string>
    6 using namespace std;
    7
    8 /*压缩数字串n,存放到t*/
    9 void R(char* n,char* t)
    10 {
    11 int i,j;
    12 int time[10]={0}; //记录n中各个数字出现的次数
    13 for(i=0;n[i];i++)
    14 time[ n[i]-'0' ]++;
    15
    16 for(i=0,j=0;i<10;i++)
    17 {
    18 if(time[i])
    19 {
    20 if(time[i]<10) //数字i出现次数<10,即占1位
    21 {
    22 t[j++]=time[i]+'0';
    23 t[j++]=i+'0';
    24 }
    25 else //数字i出现次数>=10,即占2位
    26 {
    27 t[j++]=time[i]/10+'0';
    28 t[j++]=time[i]%10+'0';
    29 t[j++]=i+'0';
    30 }
    31 }
    32 }
    33 t[j]='\0';
    34
    35 return;
    36 }
    37
    38 int main(int i,int j)
    39 {
    40 char n[16][85]; //n[0]为原串,n[1~15]分别为n连续压缩15次的数字串
    41
    42 while(cin>>n[0] && n[0][0]!='-')
    43 {
    44 bool flag1=false; //属性1,n is self-inventorying
    45 int flag2=0; //属性2,n is self-inventorying after j steps,顺便记录j
    46 int flag3=0; //属性3,n is enters an inventory loop of length k,顺便记录k
    47
    48 for(i=1;i<=15;i++)
    49 R(n[i-1],n[i]);
    50
    51 if(!strcmp(n[0],n[1])) //属性1,n压缩1次就是其本身
    52 flag1=true;
    53
    54 if(!flag1)
    55 {
    56 for(j=1;j<15;j++)
    57 if(!strcmp(n[j],n[j+1])) //属性2, n压缩j次后的数字串n[j]具有属性1
    58 {
    59 flag2=j;
    60 break;
    61 }
    62
    63 if(!flag2)
    64 {
    65 for(j=1;j<=15;j++) //属性3,两两枚举各次压缩的数字串,注意循环间隔>=2
    66 {
    67 for(i=0;i<=j-2;i++)
    68 {
    69 if(!strcmp(n[j],n[i]))
    70 {
    71 flag3=j-i;
    72 break;
    73 }
    74 }
    75 if(flag3)
    76 break;
    77 }
    78 }
    79 }
    80
    81 if(flag1)
    82 cout<<n[0]<<" is self-inventorying"<<endl;
    83 else if(flag2)
    84 cout<<n[0]<<" is self-inventorying after "<<flag2<<" steps"<<endl;
    85 else if(flag3)
    86 cout<<n[0]<<" enters an inventory loop of length "<<flag3<<endl;
    87 else
    88 cout<<n[0]<<" can not be classified after 15 iterations"<<endl;
    89 }
    90 return 0;
    91 }

     

     

    Sample Input

    22

    31123314

    314213241519

    21221314

    111222234459

    123456789

    654641656

    2101400052100005496

    10000000002000000000

    333

    1

    99999999999999999999999999999999999999999999999999999999999999999999999999999999

    0000

    0001

    0111

    1111

    123456789

    456137892

    123213241561

    543265544536464364

    5412314454766464364

    543267685643564364

    5423434560121016464364

    -1

     

    Sample Output

    22 is self-inventorying

    31123314 is self-inventorying

    314213241519 enters an inventory loop of length 2

    21221314 is self-inventorying after 2 steps

    111222234459 enters an inventory loop of length 2

    123456789 is self-inventorying after 5 steps

    654641656 enters an inventory loop of length 2

    2101400052100005496 enters an inventory loop of length 2

    10000000002000000000 enters an inventory loop of length 3

    333 is self-inventorying after 11 steps

    1 is self-inventorying after 12 steps

    99999999999999999999999999999999999999999999999999999999999999999999999999999999 can not be classified after 15 iterations

    0000 enters an inventory loop of length 2

    0001 is self-inventorying after 8 steps

    0111 is self-inventorying after 8 steps

    1111 is self-inventorying after 8 steps

    123456789 is self-inventorying after 5 steps

    456137892 is self-inventorying after 5 steps

    123213241561 enters an inventory loop of length 2

    543265544536464364 enters an inventory loop of length 2

    5412314454766464364 is self-inventorying after 3 steps

    543267685643564364 enters an inventory loop of length 2

    5423434560121016464364 is self-inventorying after 3 steps

  • 相关阅读:
    5555
    3333
    4444
    试验2
    Android之TextView灵活使用(转载)
    Android之使用Android-query框架进行开发(一)(转载)
    Android 之Html的解析(使用jsoup)
    Android之动画的学习(转载)
    Android之官方下拉刷新控件SwipeRefreshLayout
    Android之sqlite的使用 (转载)
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2132774.html
Copyright © 2011-2022 走看看