您的位置:首页 > 其它

计蒜客贪心之跳跃游戏

2018-03-07 17:36 274 查看
给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:A=[2,3,1,1,4]A = [2,3,1,1,4]A=[2,3,1,1,4] 能够跳跃到最后一个下标,输出
true

A=[3,2,1,0,4]A = [3,2,1,0,4]A=[3,2,1,0,4] 不能跳跃到最后一个下标,输出
false

输入格式

第一行输入一个正整数 n(1≤n≤500)n(1 \leq n \leq 500)n(1≤n≤500),接下来的一行 nnn 个整数,输入数组 AiA_iAi​。

输出格式

如果能跳到最后一个下标,输出
true
,否则输出
false

样例输入

5
2 0 2 0 1

样例输出

true
main.cpp
代码高亮 Sublime Vim Emacs 环境配色亮色配色暗色配色 暗色配色

返回

亮色配色
暗色配色
代码缩进248 4

返回

2
4
8
                                                                 C 语言                                                                  C++ 语言 (C++11)                                                                  C++ 语言 (C++14)                                                                  Java 语言                                                                  Python 语言 (2.7)                                                                  Python 语言 (3.5)                                                                  Ruby 语言                                                                  Blockly 语言                                                                  Octave 语言
df00
                                                                 Pascal 语言 C++ 语言 (C++11)

返回

C 语言
C++ 语言 (C++11)
C++ 语言 (C++14)
Java 语言
Python 语言 (2.7)
Python 语言 (3.5)
Ruby 语言
Blockly 语言
Octave 语言
Pascal 语言
通用逻辑循环数学文本列表颜色变量函数 ​x37 1
#include<iostream>
2
#include<cstdio>
3
using namespace std;
4
int a[505];
5
6
int f(int b,int c){
7
int max = b+1;
8
for(int i = b+1 ; i <= c ; i ++){
9
if(a[max]+max < a[i]+i){
10
max = i;
11
}
12
}
13
return max;
14
}
15
16
int main(){
17
int n,i;
18
scanf("%d",&n);
19
for(i = 1 ; i <= n ; i ++){
20
scanf("%d",&a[i]);
21
}
22
int length = 1,s = 1,e = a[s];
23
while(length<n){
24
if(s == s+e)
25
break;
26
length = f(s,s+e);
27
//cout<<"length = "<<length<<endl;
28
s = f(s,s+e);
29
//cout<<"new s = "<<s<<endl;
关闭终端 终端 - 计蒜客

思路:我最开始以为是加油站问题,后来想想不是的。加油站问题是尽可能少的进加油站加油判断是不是能到达终点。这道题不限制加油次数,意思是在每个起点后的一个区间内找下标+对应增加距离的最大值,判断是不是能到达终点。
#include<iostream>
#include<cstdio>
using namespace std;
int a[505];

int f(int b,int c){//寻找区间内能跑最远的下标
int max = b+1;
for(int i = b+1 ; i <= c ; i ++){
if(a[max]+max < a[i]+i){
max = i;
}
}
return max; //返回最远距离对应的下标
}

int main(){
int n,i;
scanf("%d",&n);
for(i = 1 ; i <= n ; i ++){
scanf("%d",&a[i]);
}
int length = 1,s = 1,e = a[s];//第一个起点是1,区间是1+a[1];
while(length<n){
if(s == s+e)//如果跨越距离为0,那么肯定到不了终点
break;
length = f(s,s+e);//已走距离等与最远距离对应的下标
//cout<<"length = "<<length<<endl;
s = f(s,s+e);//新起点等于新区间内最远距离对应下标
//cout<<"new s = "<<s<<endl;
e = a[s];//区间长度等与新起点对应的数
//cout<<"new e = "<<e<<endl;
}
if(length<n)
printf("false\n");
else
printf("true\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: