Kolakoski序列

Kolakoski序列是一种自我生成的无限序列,其特征在于相邻相同数字被分为一组后,各组长度形成的序列与原始序列一致。例如,从[1, 2]开始,可以构建出[1, 2, 2, 1, 1, 2, 1, 2, 2, 1, ...]等。通过对不同初始整数组的处理,如[2, 3]和[2, 1, 3, 1],可以得到不同的Kolakoski序列。" 128363612,16523926,洛谷B2049题解:构造最大数,"['算法', 'C++', 'C语言']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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,...]

介绍:

Kolakoski序列是一个仅由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,…
它的定义很简单,若把数列中相同的数定为一组,令a(1)=1,a(2)=2,则a(n)等于第n组数的长度。
可以根据这个定义来推算第三项以后的数:例如由于a(2)=2,因此第2组数的长度是2,因此a(3)=2,;
由于a(3)=2,所以第三组数的长度是2,因此a(4)=a(5)=1;由于a(4)=1,a(5)=1,所以第四组数和第五组数的长度都为1,因此a(6)=2,a(7)=1,
以此类推...(来自百度百科)
备注:网上笔试题,代码是参考网上别人的,具体出处找不到了,请谅解。摘抄记录下来方便日后学习。如果有问题尽请批评指正,希望可以和大神一起交流。
java代码如下:
import java.util.ArrayList;
import java.util.Scanner;

public class MainOne {
     	
   public static void main(String[] args) {
	   Scanner sc=new Scanner(System.in);
	   int n=sc.nextInt();
	   int m=sc.nextInt();
	   int[] a=new int[m];
	  
	   
	   
	   for (int i = 0; i < a.length; i++) {
		   int next=sc.nextInt();
           a[i]=next;
	}
	   ArrayList<Integer> list=new ArrayList<Integer>();
	   for (int i = 0; i < a[0]; i++) {
		list.add(a[0]);
	}
	   
	 int count=1;
	 if (list.size()==1) {
		for (int i = 0; i < a[1]; i++) {
			list.add(a[i]);
		}
		count=2;
	}
	 
	 while (list.size()<n) {
		int time=list.get(count);
		for (int i = 0; i < time; i++) {
			list.add(a[count%m]);
		}
		count++;
		
	} 
	
	  for (int i = 0; i < n; i++) {
		  System.out.println(list.get(i));
	} 
	
}


}

示例:

输入:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值