计蒜客贪心之跳跃游戏
2018-03-07 17:36
274 查看
给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:A=[2,3,1,1,4]A = [2,3,1,1,4]A=[2,3,1,1,4] 能够跳跃到最后一个下标,输出
A=[3,2,1,0,4]A = [3,2,1,0,4]A=[3,2,1,0,4] 不能跳跃到最后一个下标,输出
代码高亮 Sublime Vim Emacs 环境配色亮色配色暗色配色 暗色配色
暗色配色
代码缩进248 4
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++11)
C++ 语言 (C++14)
Java 语言
Python 语言 (2.7)
Python 语言 (3.5)
Ruby 语言
Blockly 语言
Octave 语言
Pascal 语言
通用逻辑循环数学文本列表颜色变量函数 x37 1
思路:我最开始以为是加油站问题,后来想想不是的。加油站问题是尽可能少的进加油站加油判断是不是能到达终点。这道题不限制加油次数,意思是在每个起点后的一个区间内找下标+对应增加距离的最大值,判断是不是能到达终点。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如: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
样例输出
truemain.cpp
代码高亮 Sublime Vim Emacs 环境配色亮色配色暗色配色 暗色配色
返回
亮色配色暗色配色
代码缩进248 4
返回
24
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"); }