博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenJudge/Poj 1661 帮助 Jimmy
阅读量:6293 次
发布时间:2019-06-22

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

1.链接地址:

bailian.openjudge.cn/practice/1661

http://poj.org/problem?id=1661

2.题目:

总Time Limit:
1000ms
Memory Limit:
65536kB
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
POJ Monthly--2004.05.15 CEOI 2000

3.思路:

动态规划题目

注意Jimmy老鼠直接落到0高度的情况

4.代码:

1 #include 
2 #include
3 #include
4 5 using namespace std; 6 7 struct FLAT 8 { 9 int x[2]; 10 int h; 11 }; 12 13 int cmp(const void* a,const void* b) 14 { 15 FLAT flat1 = *((FLAT *)a); 16 FLAT flat2 = *((FLAT *)b); 17 18 return flat1.h - flat2.h; 19 } 20 21 int main() 22 { 23 //freopen("C://input.txt","r",stdin); 24 25 int t; 26 cin >> t; // 0 <= t <= 20 27 28 int i,j,k; 29 30 int n,x,y,max; 31 while(t--) 32 { 33 //1 <= N <= 1000,-20000 <= X, X1[i], X2[i] <= 20000,0 < H[i] < Y <= 20000(i = 1..N) 34 cin >> n >> x >> y >> max; 35 36 FLAT *arr_flat = new FLAT[n]; 37 38 for(i = 0; i < n; ++i) cin >> arr_flat[i].x[0] >> arr_flat[i].x[1] >> arr_flat[i].h; 39 qsort(arr_flat,n,sizeof(FLAT),cmp); 40 41 //for(i = 0; i < n; ++i) cout << arr_flat[i].x[0] << " " << arr_flat[i].x[1] << " " << arr_flat[i].h << endl; 42 43 int m; 44 for(m = n - 1; m >= 0; --m) 45 { 46 if(y - arr_flat[m].h <= max && x >= arr_flat[m].x[0] && arr_flat[m].x[1] >= x) break; 47 } 48 if(m < 0) 49 { 50 cout << y << endl; 51 continue; 52 } 53 54 //dp 55 int **dp = new int*[m + 1]; 56 for(i = 0; i <= m; ++i) dp[i] = new int[2]; 57 58 dp[0][0] = arr_flat[0].h; 59 dp[0][1] = arr_flat[0].h; 60 61 for(i = 1; i <= m; ++i) 62 { 63 for(j = 0; j < 2; ++j) 64 { 65 int flag = 0; 66 for(k = i - 1; k >= 0; --k) 67 { 68 if(arr_flat[i].h - arr_flat[k].h > max) break; 69 else 70 { 71 if(arr_flat[k].x[0] <= arr_flat[i].x[j] && arr_flat[k].x[1] >= arr_flat[i].x[j]) 72 { 73 flag = 1; 74 break; 75 } 76 } 77 } 78 if(flag == 0) 79 { 80 if(arr_flat[i].h < max) dp[i][j] = arr_flat[i].h; 81 else dp[i][j] = -1; 82 } 83 else 84 { 85 if(dp[k][0] == -1 && dp[k][1] == -1) dp[i][j] = -1; 86 else if(dp[k][0] == -1) dp[i][j] = dp[k][1] + (arr_flat[i].h - arr_flat[k].h) + (arr_flat[k].x[1] - arr_flat[i].x[j]); 87 else if(dp[k][1] == -1) dp[i][j] = dp[k][0] + (arr_flat[i].h - arr_flat[k].h) + (arr_flat[i].x[j] - arr_flat[k].x[0]); 88 else 89 { 90 int temp1 = dp[k][0] + (arr_flat[i].h - arr_flat[k].h) + (arr_flat[i].x[j] - arr_flat[k].x[0]); 91 int temp2 = dp[k][1] + (arr_flat[i].h - arr_flat[k].h) + (arr_flat[k].x[1] - arr_flat[i].x[j]); 92 dp[i][j] = temp1 < temp2 ? temp1 : temp2; 93 } 94 } 95 } 96 } 97 98 if(dp[m][0] == -1) cout << dp[m][1] + (arr_flat[m].x[1] - x) + (y - arr_flat[m].h) << endl; 99 else if(dp[m][1] == -1) cout << dp[m][0] + (x - arr_flat[m].x[0]) + (y - arr_flat[m].h) << endl;100 else101 {102 int temp1 = dp[m][1] + (arr_flat[m].x[1] - x) + (y - arr_flat[m].h);103 int temp2 = dp[m][0] + (x - arr_flat[m].x[0]) + (y - arr_flat[m].h);104 cout << (temp1 < temp2 ? temp1 : temp2) << endl;105 }106 107 108 for(i = 0; i <= m; ++i) delete [] dp[i];109 delete [] dp;110 111 delete [] arr_flat;112 }113 114 115 return 0;116 }

 

转载于:https://www.cnblogs.com/mobileliker/p/3576760.html

你可能感兴趣的文章
第四十八条:如果需要精确的答案,请避免使用float和double
查看>>
Mxnet框架搭建
查看>>
如何看待程序与编程语言
查看>>
Android 开发笔记 “线程交互(Handler+Thread 和 AsyncTask)”
查看>>
Idea创建maven项目,报错xxx already exists in VFS
查看>>
使用ffmpeg实现合并多个音频为一个音频的方法
查看>>
【图解数据结构】 二叉树遍历
查看>>
laravel框架——路由
查看>>
inline-block兼容IE7
查看>>
random模块
查看>>
在二元树中找出和为某一值的所有路径
查看>>
使用PowerDesigner 15对现有数据库进行反向工程(转)
查看>>
怎样去思考问题 解决问题 zkc学长的福利
查看>>
[python]python2与python3版本的区别
查看>>
关于任务分配方式的一种设想
查看>>
11个很棒的 jQuery 图表库
查看>>
Android线程处理
查看>>
更新 TeX Live 软件包
查看>>
Exp3 免杀原理与实践 Week5 - 20165201
查看>>
嵌套查询
查看>>