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 }