专栏文章

题解:P13517 [KOI 2025 #2] 障碍物

P13517题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miommlds
此快照首次捕获于
2025/12/02 21:41
3 个月前
此快照最后确认于
2025/12/02 21:41
3 个月前
查看原文

题意

本题要求我们以最小的移动次数跳过所有障碍物,其中每个障碍物必须通过跳跃动作越过。关键在于每次跳跃必须从障碍物前一格开始,并确保相邻障碍物之间的距离大于一。

思路分析

  1. 障碍物合法性检查:若存在两个相邻障碍物距离为 11,则无法跳过,直接输出 1-1
  2. 模拟移动过程: 初始化当前位置为 00,移动次数为 00。 遍历每个障碍物,计算从当前位置到障碍物前一格所需的步数。 每到达一个障碍物前一格,执行一次跳跃,更新位置和移动次数。

复杂度分析

时间复杂度: O(N)O (N),仅需遍历一次障碍物数组。 空间复杂度: O(N)O (N),存储障碍物位置。

代码

CPP
#include <bits/stdc++.h>
using namespace std;
int a[3000005];
int main() {
    int n,t;
    cin >> n;
    for(int i = 1;i < n;i ++){
    	scanf("%d",&t);
    	a[t] ++;
	}
    scanf("%d",&t);
   	a[t] ++;
   	int d = t;
    int ans = 0;
    for(int i = 0;i <= d;i ++){
        if(a[i]){
        	cout << -1;
        	return 0;
		}
		else if(a[i + 2]) ans ++;
		else ans ++,i ++;
    }
    cout << ans;
    return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...