1600: 赛车游戏(PIPIPOJ)
题目描述
一条赛道上有n个停车点,每个停车点都有一辆车,第i辆车可以最多行驶a[i]个停车点。
PIPI可以在任意一个停车点换车,问PIPI最少换几次车可以到达终点(第n个停车点)。
输入
第一行输入T(1<=T<=100)表示测试样例个数。
对于每组样例,第一行输入停车点数量n(1<=n<=1e5)。
第二行输入n个整数,代表第i辆车最多可以行驶a[i]个停车点(0<=a[i]<=1000)。
输出
对于每组测试用例,输出到达终点的最少换车次数。如果不能到达终点,输出-1。
样例输入
3
5
2 3 1 1 4
3
3 2 1
3
1 0 2
样例输出
1
0
-1
题解1(C++版本)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int t, n, a[N];
int main(){
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
int start = 1,end = 1, pos;
int ans = 0; // ans表示到达[start,end]所需的最少步数
while(ans <= n){ //ans最大为n - 1步,每个停车点走一步,这里也可以将条件改成ans < n
pos = end;
for(int j = start; j <= end; j++) pos = max(pos, j + a[j]); //pos表示当前步数下,所能到达的最远位置
if(pos >= n) break; // 当前步数下,已经可以到达终点,结束
start = end + 1; // 下一步遍历的最左端
end = pos; // 下一步遍历的最右端
ans++; // 步数+1
}
if(pos < n) printf("-1\n");
else printf("%d\n", ans);
}
return 0;
}