POJ1016-Numbers 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

posted on 2011-08-09 20:19  小優YoU  阅读(812)  评论(0编辑  收藏  举报

导航