1 /*
2 本程序说明:
3
4 Kolakoski序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列。
5 他的前几项为1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,
6 如果相同数字是一组,则每一组的个数为1,2,2,1,1,2,1,2,2,1,2,2,1,1
7 a(n)等于第n组数的长度,因此是自描述的。目前没有递推公式,只能用自描述方式给出
8 本题为Kolakoski序列的变形,可输入任意一组数,构建Kolakoski序列
9 输入为 n m. n是长度,m是给的数个数,剩下一行是数组.
10 20 2
11 1 2
12 输出:1 2 2 1 1 2 1 2 2 1 2 2 1 1 2 1 1 2 2 1
13 30 4
14 2 1 3 1
15 输出:2 2 1 1 3 1 2 2 2 1 3 3 1 1 2 2 1 3 3 3 1 1 1 2 1 3 3 1 1 2
16
17 */
18 #include <iostream>
19 #include <vector>
20 using namespace std;
21
22 int main()
23 {
24 int n,m;
25 while(cin>>n>>m){
26 vector<int> v(m);
27 for(int i=0;i<m;++i){
28 cin>>v[i];
29 }
30 vector<int> res;
31
32 int i=0;
33 int j=0;
34 int tmp=v[0];//启动项
35 int count=0;
36 while(count<n){
37 while(tmp--){
38 res.push_back(v[i]);
39 ++count;
40 if(count==n)
41 break;
42 }
43 ++i;
44 // if(i==(int)v.size())//v到达尾部,重新置为头部开始循环
45 // i=0;
46 //或
47 i%=(int)v.size();
48
49 ++j;
50 tmp=(res.size()<2)?v[1]:res[j];//防止res位数不够
51 }
52 for(int val:res)
53 cout<<val<<" ";
54 }
55 return 0;
56 }
原题截图: