时间:2016-03-29 21:36:50 星期二
题目编号:[2016-03-29][POJ][1661][]Help Jimmy]
#include <algorithm>#include <cstring>#include <cstdio>using namespace std;int n,x,y,maxh;struct Plat{ int l,r,h; bool operator < (const Plat & a)const{ return h < a.h; } Plat(int _l = 0,int _r = 0,int _h = 0):l(_l),r(_r),h(_h){} int canFallOn(int _x,int _h){ return _x >= l && _x <= r && _h >= h && (_h - h) <= maxh; }}a[1000 + 10];int dp[1000 + 10][2];void toleft(int i){ for(int k = i - 1;k > 0;--k){ if(a[k].canFallOn(a[i].l,a[i].h)){ dp[i][0] = a[i].h - a[k].h + min (a[i].l - a[k].l + dp[k][0], a[k].r - a[i].l + dp[k][1]); return ; } } if(a[i].h - a[0].h > maxh) dp[i][0] = 0x7f7f7f7f; else dp[i][0] = a[i].h; }void toright(int i){ for(int k = i - 1;k > 0;--k){ if(a[k].canFallOn(a[i].r,a[i].h)){ dp[i][1] = a[i].h - a[k].h + min (a[i].r - a[k].l + dp[k][0], a[k].r - a[i].r + dp[k][1]); return ; } } if(a[i].h - a[0].h > maxh) dp[i][1] = 0x7f7f7f7f; else dp[i][1] = a[i].h; }void dfs(){ Plat tmp(x,x,y); a[0] = tmp; a[n + 1] = Plat(-20010,20010,0); sort(a,a + n + 2); for(int i = 1 ;i <= n + 1 ;++i){ toleft(i); toright(i); } printf("%d\n",min(dp[n + 1][0],dp[n + 1][1]));}int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d%d%d",&n,&x,&y,&maxh); for(int i = 1 ; i <= n ; ++i){ scanf("%d%d%d",&a[i].l ,&a[i].r,&a[i].h ); } dfs(); } return 0;}