Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。
设计一个程序,计算Jimmy到底地面时可能的最早时间。
设计一个程序,计算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恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。
Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。
Output
对输入的每组测试数据,输出一个整数,Jimmy到底地面时可能的最早时间。
Sample Input
1 3 8 17 20 0 10 8 0 10 13 4 14 3
Sample Output
23
Source
比较经典的一道题,用dp递归来做,直接上代码吧
#include <iostream> #include <vector> #include <algorithm> #include <cstring> using namespace std; const int MAXLEN = 2000; const int INFINIT = 1000000; struct Platform { int Lx; int Rx; int h; }; vector<Platform> platforms; int LeftMinTime[MAXLEN]; int RightMinTime[MAXLEN]; int n,x,y,imax; //递归求解 int MinTime(int L,bool bLeft) { int y=platforms[L].h; int x; if(bLeft) x=platforms[L].Lx; else x=platforms[L].Rx; int i; for(i = L + 1; i <= n; i++) if(x >= platforms[i].Lx && x <= platforms[i].Rx) break; if(i <= n) { if(y - platforms[i].h > imax) return INFINIT; } else { if(y > imax) return INFINIT; else return y; } int iLeftTime = y - platforms[i].h + x - platforms[i].Lx; int iRighttime = y - platforms[i].h + platforms[i].Rx - x; if(LeftMinTime[i] == -1) LeftMinTime[i] = MinTime(i, true); if(RightMinTime[i] == -1) RightMinTime[i] = MinTime(i, false); iLeftTime += LeftMinTime[i]; iRighttime += RightMinTime[i]; if(iLeftTime > iRighttime) return iRighttime; return iLeftTime; } //for cmpare bool cmpare(const Platform & v1, const Platform & v2) { return v1.h>v2.h; } int main() { int t; while(cin>>t && (t >= 0 && t <= 20)) { for(int i = 0; i < t; i++) { memset(LeftMinTime, -1, sizeof(LeftMinTime)); memset(RightMinTime, -1, sizeof(RightMinTime)); cin>>n>>x>>y>>imax; Platform temp; temp.Lx = x; temp.Rx = x; temp.h = y; platforms.push_back(temp); for(int j = 0; j<n; j++) { cin>>temp.Lx>>temp.Rx>>temp.h; platforms.push_back(temp); } sort(platforms.begin(),platforms.end(), cmpare); cout<<MinTime(0,true)<<endl; platforms.erase(platforms.begin(),platforms.end()); } } return 0; }