P1929 迷之阶梯
题目描述
在经过地球防卫小队的数学家连续多日的工作后,外星人发的密码终于得以破解。它 告诉我们在地球某一处的古老遗迹中,存在有对抗这次灾难的秘密武器。防卫小队立即赶 到这处遗迹。要进入遗迹,需要通过一段迷之阶梯。登上阶梯必须要按照它要求的方法, 否则就无法登上阶梯。它要求的方法有以下三个限制:
如果下一步阶梯的高度只比当前阶梯高 1,则可以直接登上。
除了第一步阶梯外,都可以从当前阶梯退到前一步阶梯。
当你连续退下 k 后,你可以一次跳上不超过当前阶梯高度 2^{k}2k 的阶梯。比如说你现 在位于第 j 步阶梯,并且是从第 j+k 步阶梯退下来的,那么你可以跳到高度不超过当前阶 梯高度+2^{k}2k 的任何一步阶梯。跳跃这一次只算一次移动。
开始时我们在第一步阶梯,由于时间紧迫,我们需要用最少的移动次数登上迷之阶梯。 请你计算出最少的移动步数。
输入输出格式
输入格式:
第一行:一个整数 N,表示阶梯步数。
第二行:N 个整数,依次为每层阶梯的高度,保证递增。
输出格式:
第一行:一个整数,如果能登上阶梯,输出最小步数,否则输出-1。
输入输出样例
说明
【样例解释】
连续登 3 步,再后退 3 步,然后直接跳上去。
【数据范围】
对于 50%的数据:1≤N≤20。
对于 100%的数据:1≤N≤200。
对于 100%的数据:每步阶梯高度不超过 2^31-1
/*让dp[i]为跳到i的最小步数。
1、sta[i]==sta[i-1]+1 --> dp[i]=dp[i-1]+1
2、dp[i]=min(dp[i],dp[j + k]+k+1) 其中k=log2(sta[i]-sta[j]),表示从i到j要退几步。*/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; int n,ans=;
int sta[],dp[]; inline int read(int &num)
{
num=;
char c=getchar();
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar()){num=num*+c-'';}
} int main()
{
memset(dp,0x3f,sizeof(dp));
read(n);
for(int i=;i<=n;i++)
{
read(sta[i]);
}
dp[]=; //跳第一个台阶需要0步
for(int i=;i<=n;i++)
{
if(sta[i]==sta[i-]+) dp[i]=dp[i-]+;
for(int j=;j<i;j++)
{
int k=ceil(log2(sta[i]-sta[j])); //计算从i要退几步才到点j,即计算2^k中的k的值
if(j+k<=i)
{
dp[i]=min(dp[i],dp[j+k]+k+); //从j+k退到j需要k步,再跳到i还需要1步
}
}
}
if(dp[n]<0x3f3f3f3f) printf("%d",dp[n]); //能跳到
else printf("-1"); //跳不到
return ;
}
P1929 迷之阶梯的更多相关文章
- 洛谷P1929 迷之阶梯
P1929 迷之阶梯 题目描述 在经过地球防卫小队的数学家连续多日的工作后,外星人发的密码终于得以破解.它 告诉我们在地球某一处的古老遗迹中,存在有对抗这次灾难的秘密武器.防卫小队立即赶 到这处遗迹. ...
- 洛谷 P1929 迷之阶梯
题目传送门 解题思路: f[i]表示跳到第i层的最少移动次数,如果可以从下面一级跳上来,那么直接跳上来,如果跳不上来,那就往后退,退到不能退或能跳上第i层 AC代码: #include<iost ...
- 【t092】迷之阶梯
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在经过地球防卫小队的数学家连续多日的工作之后,外星人发的密码终于得以破解.它告诉我们在地球某一处的古老 ...
- CONTEST36 小Z的模拟赛(2)
A.小Z的可恶路障 题目:http://www.luogu.org/problem/show?pid=U126 题解:暴力也可以过吧.我为了保险先求了一次最短路,然后枚举这条最短路上的所有边... 代 ...
- Java中文字符处理的四大迷题
虽然计算机对英文字符的支持非常不错,我们也恨不得写的程序只会处理英文的数据,但是昨为中国人,无可避免地要处理一些中文字符.当很简单的一件事情,遇到了中文,一切就不同了!本文就会讲述实际生产环境中遇到的 ...
- [LeetCode] Word Ladder 词语阶梯
Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformatio ...
- 你知道 Twitter,但你可能不知道它的 “成长模式” 和 “参与阶梯”
当你为产品创建 “成长模式” 时,你需要回答以下关键问题(类Twitter产品:http://www.jinhusns.com/Products/Download/?type=xcj ): 目标:产品 ...
- [No00002E]关于大数据,你不知道的6个迷思
还是那个观点:计算机,编程语言,互联网,大数据等等都只是工具! 导语:看过美剧<纸牌屋>没?知道这部"白宫甄嬛传"为什么会火吗?靠的是大!数!据! 过去两年,在 Net ...
- 迷之this?(转)
1. 迷之this 对于刚开始进行 JavaScript 编程的开发者来说,this 具有强大的魔力,它像谜团一样需要工程师们花大量的精力去真正理解它. 在后端的一些编程语言中,例如 Java.PHP ...
随机推荐
- 微信小程序的页面跳转==编程式导航传参 和 标签的方法传参==以及如何过去传递过来的参数
小程序导航传参接收传递过来的参数 在onload中 实例
- PB计算两个日期相差月份(计算工龄)
ll_intime_y = year(date(this.object.in_factory_day[row])) ll_intime_m = month(date(this.object.in_fa ...
- em...刚打完一点cf。。 有点子感悟
首先,下笔一定要读清楚题目. 情况多考虑一下. 这几次的模拟赛,分类思想很重要,往往一大坨东西扔给你,你不去尝试分类的话就很难整理清楚.
- EfCore基本用法
db first 和 code first的基本使用方法 https://www.cnblogs.com/Starts_2000/p/mysql-efcore20-codefirst-dbfirst- ...
- 无重复字符串的最长子串 python
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
- GoAccess 视图化access.log 日志
1.安装GoAccess 工具可以直接使用 apt-get install goaccess 2.使用goaccess命令将日志生成html文件 goaccess 日志路径 -o 输出HTML的路径 ...
- csv注入复现代码
以下代码生成的csv文件,使用Microsoft Execl能成功弹出计算器,虽然打开时有安全提示,但是大多数src还是会接收该类漏洞 -------------------------------- ...
- 【leetcode】338 .Counting Bits
原题 Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate t ...
- python之命名空间与作用域
一.命名空间与作用域 在命名空间中的名称能将任何python对象作为值,在不同的命名空间中相同的名称可以与不同的对象相关联.但是,如果存在名称解析协议,则多个命名空间可以一起工作来解析名称.也就是说, ...
- 再见 Docker,是时候拥抱下一代容器工具了
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...