M - Help Jimmy

2024-03-29 17:32
文章标签 help jimmy

本文主要是介绍M - Help Jimmy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

"Help Jimmy" 是在下图所示的场景上完成的游戏。 


场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。 

Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。 

设计一个程序,计算Jimmy到底地面时可能的最早时间。 

Input

第一行是测试数据的组数t(0 <= t <= 20)。每组测试数据的第一行是四个整数N,X,Y,MAX,用空格分隔。N是平台的数目(不包括地面),X和Y是Jimmy开始下落的位置的横竖坐标,MAX是一次下落的最大高度。接下来的N行每行描述一个平台,包括三个整数,X1[i],X2[i]和H[i]。H[i]表示平台的高度,X1[i]和X2[i]表示平台左右端点的横坐标。1 <= N <= 1000,-20000 <= X, X1[i], X2[i] <= 20000,0 < H[i] < Y <= 20000(i = 1..N)。所有坐标的单位都是米。 

Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。 

Output

对输入的每组测试数据,输出一个整数,Jimmy到底地面时可能的最早时间。

Sample Input

1
3 8 17 20
0 10 8
0 10 13
4 14 3

Sample Output

23

感受:对于这道题我差点做了一天。。。,对于算法的思路,刚开始我是先用类似上升子序列的形式来做的,每一个当前的板子,搜索前边的板子的左半区或右半区加上高度最小,存在当前的板子然后把这个板子的左半区和有半区分别存,但是这个思路错了,后来又想到了另一种思路,每一个当前板子,存上一个板子的高度加上当前板子的哪一个半区最小而且分两个半区,这样每一个半区就会存不同的板子。

代码:

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define inf 0x3f3f3f3fusing namespace std;struct node
{int x1,x2,gao;
}h[2000];int cmp(struct node s,struct node q)
{return s.gao>q.gao;
}int dp1[20009],tt[20009],ff[20009],dp2[20009];int main()
{int a;scanf("%d",&a);while(a--){int n,x,y,maxx,i,j;memset(h,0,sizeof(h));scanf("%d %d %d %d",&n,&x,&y,&maxx);for(i=1;i<=n;i++){scanf("%d %d %d",&h[i].x1,&h[i].x2,&h[i].gao);}sort(h+1,h+1+n,cmp);int v,sum=0;h[n+1].x1=-30000;h[n+1].x2=30000;h[n+1].gao=0;for(i=1;i<=n+1;i++){if(h[i].x1<=x&&x<=h[i].x2){sum=y-h[i].gao;v=i;break;}}if(v==n+1){printf("%d\n",sum);continue;}memset(dp1,inf,sizeof(dp1));memset(dp2,inf,sizeof(dp2));int k,g;dp1[v]=x-h[v].x1+sum;dp2[v]=h[v].x2-x+sum;int xx,yy;memset(tt,0,sizeof(tt));memset(ff,0,sizeof(ff));for(k=v;k<=n;k++){xx=0;yy=0;for(g=k+1;g<=n+1;g++){if(h[k].x1>=h[g].x1&&h[k].x1<=h[g].x2&&xx==0){xx=1;tt[k]=g;}if(h[k].x2>=h[g].x1&&h[k].x2<=h[g].x2&&yy==0){yy=1;ff[k]=g;}if(xx==1&&yy==1)break;}}for(i=v+1;i<=n;i++){for(j=v;j<i;j++){if(h[j].gao-h[i].gao<=maxx&&tt[j]==i){dp1[i]=min(dp1[i],dp1[j]+h[j].gao-h[i].gao+h[j].x1-h[i].x1);dp2[i]=min(dp2[i],dp1[j]+h[j].gao-h[i].gao+h[i].x2-h[j].x1);}if(h[j].gao-h[i].gao<=maxx&&ff[j]==i){dp1[i]=min(dp1[i],dp2[j]+h[j].gao-h[i].gao+h[j].x2-h[i].x1);dp2[i]=min(dp2[i],dp2[j]+h[j].gao-h[i].gao+h[i].x2-h[j].x2);}}}int ans=inf;for(i=v;i<=n;i++){if(tt[i]==n+1&&h[i].gao<=maxx)ans=min(ans,dp1[i]+h[i].gao);if(ff[i]==n+1&&h[i].gao<=maxx)ans=min(ans,dp2[i]+h[i].gao);}printf("%d\n",ans);}return 0;
}

这篇关于M - Help Jimmy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/859200

相关文章

HDU 1712 ACboy needs your help (分组背包)

OJ题目:click here~~ 题意分析:分组背包入门题。N个课程,最多可使用M天的时间。给出i课程用j天所获得的profit 。 求最多使用M天的最大profit。对课程i ,1--M天的profit 只能选一个,或者不选。也就是说有的课程不上也没有关系。明显的分组背包。 AC_CODE int x[101][101];int main(){int n , m;while(c

默默的学python——两个重要的函数dir()、help()

一、dir()函数 dir()函数在Python中用于返回一个对象的所有属性和方法的列表,当你对一个函数使用dir()时,它会返回函数对象的所有可访问的属性和方法的名字列表。 具体的说,dir()函数获取的内容包括: 1.特殊方法和魔法方法 如 call、code、defaults、doc、globals、__name__等,这些方法和属性是函数对象的一部分,提供了对函数元数据的访问。

第一个golang项目增加help指令并调整指令模式

第一个golang项目增加help指令并调整指令模式 调整指令模式增加help指令减少了配置文件的解析读取次数新指令模式打包并运行 上一篇文章 调整指令模式 version指令修改为-v和-versionreplace指令修改为-r和-replacedir参数修改为-d和 -directory package commandsimport ("flag""fmt""lo

Help is needed for Dexter

原文请访问我的博客   http://xiaoshig.sinaapp.com/ Description Problem H Help is needed for Dexter Time Limit: 3 Second   Dexter is tired of Dee Dee. So he decided to keep Dee Dee busy

Command line option syntax error.type Command /? for help

电脑装思维导图的时候,报错显示“Command line option syntax error.Type Command /? for help.”就查了一下,原来是系统没有C++2005,需要安装,就上网下载了一个vcredist_x86.exe,但是双击安装,仍然出现这个错误。 没办法,接着上网查吧,是什么原因呢?网上说是因为该文件安装不支持中文安装路径,然后我就把文件夹改成了英文名称

Help with Intervals 线段树并查集

Time Limit: 6000MS Memory Limit: 131072KTotal Submissions: 9784 Accepted: 2320Case Time Limit: 2000MS Description

npm error network ‘proxy‘ config is set properly. See: ‘npm help config‘

使用" npm install " 或者 "  npm i " 初始化项目依赖失败 npm error network 'proxy' config is set properly. See: 'npm help config' 出现这样的解决方法如下:  1.查看代理 //代理npm config get proxy //缓存npm config get npm confi

Git报错git: ‘remote-http‘ is not a git command. See ‘git --help‘

目录 一、问题描述二、解决方法 一、问题描述 CentOS 7 下执行 git clone http://xxxx 命令时报错,Git 版本为 2.35.1 : git: 'remote-http' is not a git command. See 'git --help' 二、解决方法 安装 libcurl-devel、curl-devel ,然后重新编译 git

登陆Oracle EBS的Form遇到问题Internet Explorer has modified this page to help prevent cross-site scripting

登陆Oracle EBS的Form遇到问题Internet Explorer has modified this page to help prevent cross-site scripting         今天在登陆Oracle EBS的Form 遇到问题Internet Explorer has modified this page to help prevent cross-site