题解:P13517 [KOI 2025 #2] 障碍物
wtr20130331 · · 题解
题意
本题要求我们以最小的移动次数跳过所有障碍物,其中每个障碍物必须通过跳跃动作越过。关键在于每次跳跃必须从障碍物前一格开始,并确保相邻障碍物之间的距离大于一。
思路分析
- 障碍物合法性检查:若存在两个相邻障碍物距离为
1 ,则无法跳过,直接输出-1 。 - 模拟移动过程:
初始化当前位置为
0 ,移动次数为0 。 遍历每个障碍物,计算从当前位置到障碍物前一格所需的步数。 每到达一个障碍物前一格,执行一次跳跃,更新位置和移动次数。
复杂度分析
时间复杂度:
代码
#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;
}