Look-and-say sequence is a sequence of integers as the following:
D, D1, D111, D113, D11231, D112213111, ...
where D
is in [0, 9] except 1. The (n+1)st number is a kind of description of the nth number. For example, the 2nd number means that there is one D
in the 1st number, and hence it is D1
; the 2nd number consists of one D
(corresponding to D1
) and one 1 (corresponding to 11), therefore the 3rd number is D111
; or since the 4th number is D113
, it consists of one D
, two 1's, and one 3, so the next number must be D11231
. This definition works for D
= 1 as well. Now you are supposed to calculate the Nth number in a look-and-say sequence of a given digit D
.
Input Specification:
Each input file contains one test case, which gives D
(in [0, 9]) and a positive integer N (≤ 40), separated by a space.
Output Specification:
Print in a line the Nth number in a look-and-say sequence of D
.
Sample Input:
1 8
Sample Output:
1123123111
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <algorithm> 3 #include <iostream> 4 #include <map> 5 #include <vector> 6 #include <set> 7 using namespace std; 8 const int maxn=100100; 9 int n,m,k; 10 int seq[50][maxn]; 11 int cnt; 12 int main(){ 13 scanf("%d %d",&n,&m); 14 seq[0][0]=n; 15 if(m==1)printf("%d",n); 16 cnt=1; 17 for(int i=1;i<m;i++){ 18 k=0; 19 int now=seq[i-1][0],num=0; 20 for(int j=0;j<cnt;j++){ 21 if(seq[i-1][j]==now){ 22 num++; 23 } 24 else{ 25 seq[i][k]=now; 26 seq[i][k+1]=num; 27 now=seq[i-1][j]; 28 num=1; 29 k+=2; 30 } 31 } 32 seq[i][k]=now; 33 seq[i][k+1]=num; 34 k+=2; 35 cnt=k; 36 } 37 for(int j=0;j<k;j++){ 38 printf("%d",seq[m-1][j]); 39 } 40 }
注意点:题目看了半天没懂,后来看懂了点理解的是前一个序列有几个什么然后输出,然后第六个样例怎么看都不对。看了大佬的思路,原来是有几个连续的数字,然后输出来。那既然n最大就40,设个二维数组直接枚举就好了,maxn一开始只设了10010,发现最后一个测试点错了,最后一个测试点应该是n=40,结果很大,maxn为1e5就够了