解题思路
正确思路:
- 先处理序列开头部分:
- 先放入
个
- 如果
,还要放入
个
- 先放入
- 然后根据已生成序列中的数字继续构造:
- 读取序列中的数字作为重复次数
- 使用ivec中循环的数字进行填充
代码
#include <iostream>
#include <vector>
using namespace std;
vector<int> generateKolakoski(int n, int m, const vector<int>& nums) {
// 结果序列
vector<int> result;
int readPos = 1; // 读取位置
int numPos = 1; // nums数组的当前位置
// 1. 处理开头特殊情况
// 先添加nums[0]个nums[0]
for (int i = 0; i < nums[0]; i++) {
result.push_back(nums[0]);
// 如果第一个数是1,需要特殊处理
if (nums[0] == 1) {
// 添加nums[1]个nums[1]
for (int j = 0; j < nums[1]; j++) {
result.push_back(nums[1]);
}
numPos = (numPos + 1) % m;
readPos++;
}
}
// 2. 继续生成序列直到达到所需长度
while (result.size() < n) {
// 获取当前组应重复的次数
int repeatCount = result[readPos];
// 添加指定次数的当前数字
for (int i = 0; i < repeatCount && result.size() < n; i++) {
result.push_back(nums[numPos]);
}
// 更新位置
numPos = (numPos + 1) % m;
readPos++;
}
return result;
}
int main() {
// 读取输入
int n, m;
cin >> n >> m;
vector<int> nums(m);
for (int i = 0; i < m; i++) {
cin >> nums[i];
}
// 生成序列
vector<int> result = generateKolakoski(n, m, nums);
// 输出结果
for (int i = 0; i < n; i++) {
cout << result[i] << endl;
}
return 0;
}
import java.util.*;
public class Main {
private static List<Integer> generateKolakoski(int n, int m, int[] nums) {
// 结果序列
List<Integer> result = new ArrayList<>();
int readPos = 1; // 读取位置
int numPos = 1; // nums数组的当前位置
// 1. 处理开头特殊情况
// 先添加nums[0]个nums[0]
for (int i = 0; i < nums[0]; i++) {
result.add(nums[0]);
// 如果第一个数是1,需要特殊处理
if (nums[0] == 1) {
// 添加nums[1]个nums[1]
for (int j = 0; j < nums[1]; j++) {
result.add(nums[1]);
}
numPos = (numPos + 1) % m;
readPos++;
}
}
// 2. 继续生成序列直到达到所需长度
while (result.size() < n) {
// 获取当前组应重复的次数
int repeatCount = result.get(readPos);
// 添加指定次数的当前数字
for (int i = 0; i < repeatCount && result.size() < n; i++) {
result.add(nums[numPos]);
}
// 更新位置
numPos = (numPos + 1) % m;
readPos++;
}
return result;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取输入
int n = sc.nextInt();
int m = sc.nextInt();
int[] nums = new int[m];
for (int i = 0; i < m; i++) {
nums[i] = sc.nextInt();
}
// 生成序列
List<Integer> result = generateKolakoski(n, m, nums);
// 输出结果
for (int i = 0; i < n; i++) {
System.out.println(result.get(i));
}
}
}
def generate_kolakoski(n, m, nums):
# 结果序列
result = []
read_pos = 1 # 读取位置
num_pos = 1 # nums数组的当前位置
# 1. 处理开头特殊情况
# 先添加nums[0]个nums[0]
for _ in range(nums[0]):
result.append(nums[0])
# 如果第一个数是1,需要特殊处理
if nums[0] == 1:
# 添加nums[1]个nums[1]
for _ in range(nums[1]):
result.append(nums[1])
num_pos = (num_pos + 1) % m
read_pos += 1
# 2. 继续生成序列直到达到所需长度
while len(result) < n:
# 获取当前组应重复的次数
repeat_count = result[read_pos]
# 添加指定次数的当前数字
for _ in range(repeat_count):
if len(result) < n:
result.append(nums[num_pos])
# 更新位置
num_pos = (num_pos + 1) % m
read_pos += 1
return result
def main():
# 读取输入
n, m = map(int, input().split())
nums = list(map(int, input().split()))
# 生成序列
result = generate_kolakoski(n, m, nums)
# 输出结果
for num in result[:n]:
print(num)
if __name__ == "__main__":
main()
算法及复杂度
- 算法:模拟
- 时间复杂度:
,其中
是需要生成的序列长度
- 空间复杂度:
,用于存储生成的序列