[语言月赛 202401] 跳房子
题目背景
跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一,趣味性、娱乐性极强,曾深受广大儿童的喜爱。
题目描述
现在我们给出一种简易跳房子游戏的玩法:
n n n 个格子从左到右一字形排开,从左到右依次被标号为 1 , 2 , ⋯ , n 1, 2, \cdots, n 1,2,⋯,n。每一个格子上都有一个正整数, i i i 号格子上的正整数是 a i a _ i ai。
这个游戏的规则如下:初始时玩家站在 1 1 1 号格子上,需要做若干次跳跃。每一次跳跃时,玩家需要从当前格子向前跳「当前格子上写的整数」数量的格子。形式化地讲,如果玩家当前处于 x x x 号格子,玩家需要跳到 x + a x x + a _ x x+ax 号格子上。
如果玩家跳到 n n n 号格子右侧的位置,称玩家出界;如果玩家恰好跳到 n n n 号格子上,称玩家胜利。这两种情况下玩家都需要停止跳跃。
现在给定格子数量和格子上的整数,你需要求解:
- 在停止跳跃后,玩家是否胜利。即,玩家是否能够恰好跳到 n n n 号格子上。
- 在停止跳跃后,玩家跳跃的总次数。
输入格式
输入共两行。
第一行为一个整数
n
n
n,代表格子的数量。
第二行为
n
n
n 个整数
a
1
,
a
2
,
⋯
,
a
n
a _ 1, a _ 2, \cdots, a _ n
a1,a2,⋯,an,代表每个格子上的数字。
输出格式
输出共两行。
第一行为一个字符串。如果玩家在停止跳跃后恰好跳到
n
n
n 号格子上,输出 Yes
,否则输出 No
。
第二行一个整数,代表玩家的总跳跃次数。
样例 #1
样例输入 #1
6
1 1 3 7 8 5
样例输出 #1
Yes
3
样例 #2
样例输入 #2
4
2 7 3 5
样例输出 #2
No
2
提示说明
样例 1 解释
样例 2 解释
数据规模与约定
对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 6 1 \leq n \leq 10 ^ 6 1≤n≤106, 1 ≤ a i ≤ 1 0 4 1 \leq a _ i \leq 10 ^ 4 1≤ai≤104。
测试点编号 | n n n | 特殊性质 |
---|---|---|
1 1 1 | = 1 = 1 =1 | 无 |
2 ∼ 4 2 \sim 4 2∼4 | ≤ 100 \leq 100 ≤100 | 无 |
5 5 5 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | a i = 1 a _ i = 1 ai=1 |
6 , 7 6, 7 6,7 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | a i = 2 a _ i = 2 ai=2 |
8 ∼ 10 8 \sim 10 8∼10 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | 无 |
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n;
cin>>n;
ll a,res=1,cnt=0;
for(ll i=1;i<n;i++)
{
cin>>a;
if(res==i)
{
res+=a;
cnt++;
}
}
if(res==n)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
cout<<cnt<<endl;
return 0;
}