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
1
3 8 17 20
0 10 8
0 10 13
4 14 3
Sample Output
23
Source
POJ Monthly--2004.05.15 CEOI 2000

3.思路:

动态规划题目

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

4.代码:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  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         else
101         {
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 }

 

posted on 2014-03-02 14:25  mobileliker  阅读(445)  评论(0编辑  收藏  举报