博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1661 Help Jimmy (动态规划)
阅读量:6510 次
发布时间:2019-06-24

本文共 3574 字,大约阅读时间需要 11 分钟。

Help Jimmy
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 7370   Accepted: 2329

Description

"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

13 8 17 200 10 80 10 134 14 3

Sample Output

23

Source

这道题题意还是要多读几遍里了解游戏规则才好设计算法,很明显数据的规模很大,不能用枚举的方法来判断,递归也肯定要超时,所以要用动态规划。这里子问题可以设为从JIMMY所在的位置到地面的最短时间;而这个时间又可以分为从左端到地面的最短时间和从右端到地面的最短时间求最小值。
然后要注意题目中要求跳跃的最大高度是MAX,所以要在里面加一个判断判断两块板子的高度差或者是到地面的高度差。
#include
#include
#include
#include
#define INF 1000000using namespace std;struct Line{ int Lx,Rx; int h; int n;//统计在这块板子上的落点的个数 int u[100];//统计该落点的位置 int v[100];//统计该落点到地面的最少时间}line[1010];int n;int maxe;int LeftMinTime[1010]={0};int RightMinTime[1010]={0};bool cmp(struct Line a,struct Line b){ if(a.h>b.h) return true; else return false;}int findmin(int x,int xl){ int i,j; //printf("line[%d].n:%d\n",x,line[x].n); if(line[x].n!=0) { for(i=0;i
maxe) LeftMinTime[x]=INF; else { LeftMinTime[x]=line[x].h; //printf("%d\n",line[x].h); } } else { if(line[x].h-line[m1].h>maxe) LeftMinTime[x]=INF; else LeftMinTime[x]=line[x].h-line[m1].h+findmin(m1,line[x].Lx); } for(i=x+1;i<=n;i++) { if(line[i].Lx<=line[x].Rx&&line[x].Rx<=line[i].Rx) {break;} } if(i<=n){flag2=1;m2=i;} if(flag2==0) { if(line[x].h>maxe) RightMinTime[x]=INF;//equal to edge of this program else RightMinTime[x]=line[x].h; } else { if(line[x].h-line[m2].h>maxe) RightMinTime[x]=INF; else RightMinTime[x]=line[x].h-line[m2].h+findmin(m2,line[x].Rx); //printf("^^%d,%d,%d\n",line[x].h,line[m2].h,findmin(m2,line[x].Rx)); } //printf("**%d,%d\n",x,xl); //printf("left[%d]:%d\n",x,LeftMinTime[x]+(xl-line[x].Lx)); //printf("right[%d]:%d\n",x,RightMinTime[x]+(line[x].Rx-xl)); if((LeftMinTime[x]+(xl-line[x].Lx))>(RightMinTime[x]+(line[x].Rx-xl))) { line[x].u[line[x].n]=xl; line[x].v[line[x].n]=RightMinTime[x]+(line[x].Rx-xl); line[x].n++; return line[x].v[line[x].n-1]; } else { line[x].u[line[x].n]=xl; line[x].v[line[x].n]=LeftMinTime[x]+(xl-line[x].Lx); line[x].n++; return line[x].v[line[x].n-1]; } }int main(){ int t; int x,y; int i,j,k; scanf("%d",&t); while(t--) { memset(line,0,sizeof(line)); scanf("%d%d%d%d",&n,&x,&y,&maxe); line[0].Lx=x; line[0].Rx=x; line[0].h=y; for(i=1;i<=n;i++) scanf("%d%d%d",&line[i].Lx,&line[i].Rx,&line[i].h); sort(line,line+n+1,cmp); //printf("%d",line[3].Lx); printf("%d\n",findmin(0,x)); } system("pause"); return 0;}

转载于:https://www.cnblogs.com/gremount/archive/2012/07/26/5768023.html

你可能感兴趣的文章
JRE与JDK简介
查看>>
2015 年最受欢迎的 7 个系统监控工具
查看>>
ActiveReports 报表应用教程 (8)---交互式报表之动态过滤
查看>>
解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()
查看>>
跟我一起学docker(四)--容器的基本操作
查看>>
磁化强度
查看>>
C/C++ 数据范围
查看>>
来来来!游戏场景风格暴露你的年纪
查看>>
三菱加工中心CNC编程G代码讲解
查看>>
LVS+keepalived+nginx
查看>>
monkey如何通过uiautomatorviewer的bounds坐标点击控件
查看>>
第22章,mysql数据库-1
查看>>
【亲测】教你如何搭建 MongoDB 复制集 + 选举原理
查看>>
网络文件共享-SAMBA
查看>>
虚拟化网络技术
查看>>
阿里云中间件推出全新开发者服务
查看>>
56.随机产生的id重复问题
查看>>
一个快速检测系统CPU负载的小程序
查看>>
PDF裁剪页面,PDF怎么裁剪页面的方法
查看>>
大数据会取代传统BI吗
查看>>