这里写自定义目录标题
更多精彩内容
这里是带你游历编程世界的Dashcoding编程社,我是Dash/北航硕士/ICPC区域赛全国排名30+/给你呈现我们眼中的世界!
256题算法特训课,帮你斩获大厂60W年薪offer
原题
米哈游校招真题史莱姆
B站动画详解
问题分析
本题的核心在于模拟史莱姆的跳跃过程,并统计每一秒钟地图上没有史莱姆的格子数量。史莱姆的跳跃规则由数组 a a a 决定, a i = 0 a_i = 0 ai=0 表示向左跳跃, a i = 1 a_i = 1 ai=1 表示向右跳跃。每秒钟都可能有史莱姆跳出地图,导致地图上某些格子不再有史莱姆。问题要求统计从第 1 1 1 秒到第 n n n 秒之间,地图上没有史莱姆的格子数量。
思路分析
本题采用枚举的方式来解决问题:
- 初始化数据: 首先读取输入的 n n n 和数组 a a a。数组 a a a 的每个元素表示对应格子的史莱姆跳跃方向。
- 跳跃模拟: 从第 1 1 1 秒到第 n n n 秒,依次模拟每个格子的史莱姆跳跃。根据跳跃方向判断史莱姆是向左跳跃还是向右跳跃,并更新目标位置。
- 统计无史莱姆的格子: 使用辅助数组 b b b 来记录每个格子上是否有史莱姆。若 a [ i ] = 0 a[i] = 0 a[i]=0,表示史莱姆向左跳跃;若 a [ i ] = 1 a[i] = 1 a[i]=1,则表示向右跳跃。根据跳跃规则,更新每个格子在第 i i i 秒时的状态。
- 输出结果: 最终输出从第 1 1 1 秒到第 n n n 秒,每一秒钟地图上没有史莱姆的格子数量。
算法实现
在实现过程中,主要通过模拟史莱姆的跳跃过程来解决问题。关键在于正确判断每个格子的史莱姆跳跃方向,并在每一秒钟更新地图状态。最终通过遍历地图状态,统计每一秒钟没有史莱姆的格子数量。
具体实现如下:
- 方向判断: 根据 a [ i ] a[i] a[i] 的值判断史莱姆的跳跃方向。
- 边界处理: 当史莱姆跳出地图时,即跳跃到了格子 0 0 0 或格子 n + 1 n+1 n+1,直接将该史莱姆移除不再考虑。
- 状态更新: 每秒钟后更新地图上格子的状态,通过累加无史莱姆的格子数得到答案。
代码详解
标准代码程序
C++代码
#include<bits/stdc++.h>
using namespace std;
int a[3010];
int b[3010];
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
if(a[i] == 0) {
b[i]++; // 向左跳跃,更新目标位置
} else {
b[n - i + 1]++; // 向右跳跃,更新目标位置
}
}
int s = 0;
for(int i = 1; i <= n; i++) {
s = s + b[i];
cout << s << " ";
}
}
Java代码
import java.util.Scanner;
public class SlimeSimulation {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n + 1];
int[] b = new int[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
if (a[i] == 0) {
b[i]++;
} else {
b[n - i + 1]++;
}
}
int s = 0;
for (int i = 1; i <= n; i++) {
s += b[i];
System.out.print(s + " ");
}
}
}
Python代码
def main():
n = int(input())
a = list(map(int, input().split()))
b = [0] * (n + 1)
for i in range(1, n + 1):
if a[i - 1] == 0:
b[i] += 1
else:
b[n - i + 1] += 1
s = 0
for i in range(1, n + 1):
s += b[i]
print(s, end=" ")
if __name__ == "__main__":
main()
Javascript代码
function main() {
const n = parseInt(prompt());
const a = prompt().split(' ').map(Number);
const b = Array(n + 1).fill(0);
for (let i = 1; i <= n; i++) {
if (a[i - 1] === 0) {
b[i]++;
} else {
b[n - i + 1]++;
}
}
let s = 0;
for (let i = 1; i <= n; i++) {
s += b[i];
process.stdout.write(s + " ");
}
}
main();
复杂度分析
时间复杂度
该算法的时间复杂度为 O ( n ) O(n) O(n),因为遍历地图和更新状态的过程都是线性时间。
空间复杂度
空间复杂度为 O ( n ) O(n) O(n),主要用于存储输入的数组 a a a 和状态数组 b b b。
总结
本题通过模拟史莱姆的跳跃过程,并通过数组的累加和判断来计算每一秒无史莱姆的格子数量。算法实现简单且高效,适用于大规模输入。