列表

详情


SH8. Kolakoski

描述

Kolakoski 序列是个自生成的无限序列。
例如,当给定的整数组为 [1, 2] 时,Kolakoski 序列是这样的:
    [1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,…]
如果我们将相邻的相同的数字分成一组,那么将会得到:
    [[1],[2,2],[1,1],[2],[1],[2,2],[1],[2,2],[1,1],[2],[1,1],[2,2],[1],[2],[1,1],[2],[1],[2,2],[1,1],…]
可以看出,每组数字交替由 1, 2 组成。
接下来对每个分组求他的长度,得到:
    [1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,…]
可以看出,经过如上的变换后,数列保持不变。
对于其他给定的整数组,同样可以用类似的方法构造 Kolakoski 序列,例如给定整数组 [2, 3] 时:
    [2,2,3,3,2,2,2,3,3,3,2,2,3,3,2,2,3,3,3,2,2,2,3,3,3,2,2,3,3,…]
给定整数组 [2, 1, 3, 1] 时,构造得到如下:
    [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,…]

输入描述

输入由两行组成: 第一行包括两个正整数 n, m 第二行包括 m 个正整数 a[] 数据规模与限制: 0 < n < 10000 1 < m < 1000 0 < a[i] < 1000 a[i] 不等于 a[i + 1] a[0] 不等于 a[m-1]

输出描述

每行一个数字,共 n 行 整数组 a 生成的 Kolakoski 序列的前 n 项

示例1

输入:

30 4
2 1 3 1

输出:

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

原站题解

C++ 解法, 执行用时: 3ms, 内存消耗: 384KB, 提交时间: 2020-11-21

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    int a[m], s[n];
    for(int i=0;i<m;i++)
        scanf("%d", &a[i]);
    for(int i=0,p=0,k=0;i<n;){
        if(i == p)
            s[p] = a[k];
        for(int j=0;j<s[p] && i<n;j++){
            printf("%d\n", a[k]);
            s[i++] = a[k];
        }
        k = (k+1)%m;
        p++;
    }
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 504KB, 提交时间: 2020-07-08

#include <bits/stdc++.h>
using namespace std;

int n, m;
int main(){
    scanf("%d %d", &n, &m);
    int num[n];
    for(int i = 0; i < m; i++){
        scanf("%d", &num[i]);
    }
    vector<int> v;
    for(int i = 0; i < num[0]; i++){
        v.push_back(num[0]);
    }
    int nownum = 1;
    int li = 1;
    while(v.size() < n){
        if(li == v.size()){
            int tmp = li;
            li = num[li];
            for(int i = 0; i < li; i++){
                v.push_back(num[nownum]);
            }
            li = tmp + 1;
        }
        else{
            for(int i = 0; i < v[li]; i++){
                v.push_back(num[nownum]);
            }
            li++;
        }
        nownum = (nownum + 1) % m;
    }
    for(int i = 0; i < n; i++){
        printf("%d\n", v[i]);
    }
    return 0;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 376KB, 提交时间: 2020-10-31

 #include <iostream>
#include <vector>
#include <cstdio>
  using namespace std;
  int main()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(m);
    for(int &x: a) cin >> x;
          vector<int> result;
    int i = 1;
    int cur = 1;
    for(int k = 0; k < a[0]; ++k) result.push_back(a[0]);
    if(a[0] == 1){
        for(int k = 0; k < a[1]; ++k) result.push_back(a[1]);
        ++i;
        ++cur;
        cur %= m;
    }
    while(result.size() < n){
        for(int k = 0; k < result[i]; ++k){
            result.push_back(a[cur]);
        }
        ++cur;
        ++i;
        cur %= m;
    }
          for(int k = 0; k < n; ++k){
        //cout << result[k] << endl;
        printf("%d\n", result[k]);
    }
}

C++ 解法, 执行用时: 4ms, 内存消耗: 376KB, 提交时间: 2020-10-31

 #include <iostream>
#include <vector>
#include <cstdio>
  using namespace std;
  int main()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(m);
    for(int &x: a) cin >> x;
          vector<int> result;
    int i = 1;
    int cur = 1;
    for(int k = 0; k < a[0]; ++k) result.push_back(a[0]);
    if(a[0] == 1){
        for(int k = 0; k < a[1]; ++k) result.push_back(a[1]);
        ++i;
        ++cur;
        cur %= m;
    }
    while(result.size() < n){
        for(int k = 0; k < result[i]; ++k){
            result.push_back(a[cur]);
        }
        ++cur;
        ++i;
        cur %= m;
    }
          for(int k = 0; k < n; ++k){
        //cout << result[k] << endl;
        printf("%d\n", result[k]);
    }
}

C++ 解法, 执行用时: 4ms, 内存消耗: 400KB, 提交时间: 2020-12-23

 #include <iostream>
#include <vector>
#include <cstdio>
  using namespace std;
  int main()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(m);
    for(int &x: a) cin >> x;
          vector<int> result;
    int i = 1;
    int cur = 1;
    for(int k = 0; k < a[0]; ++k) result.push_back(a[0]);
    if(a[0] == 1){
        for(int k = 0; k < a[1]; ++k) result.push_back(a[1]);
        ++i;
        ++cur;
        cur %= m;
    }
    while(result.size() < n){
        for(int k = 0; k < result[i]; ++k){
            result.push_back(a[cur]);
        }
        ++cur;
        ++i;
        cur %= m;
    }
          for(int k = 0; k < n; ++k){
        //cout << result[k] << endl;
        printf("%d\n", result[k]);
    }
}

上一题