POJ 1661 Help Jimmy
Posted IKnowYou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1661 Help Jimmy相关的知识,希望对你有一定的参考价值。
传送门:http://poj.org/problem?id=1661
解题思路:其实吧,不难就是细节有点麻烦。
实现代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN=20005; const int INF=1<<30; struct Node{ int lx,rx,h; bool operator <(const Node &rhs) const{ return h<rhs.h; } }line[MAXN]; int dp[MAXN][2]; int main(){ int T; scanf("%d",&T); while(T--){ int N,X,Y,MAX; scanf("%d%d%d%d",&N,&X,&Y,&MAX); line[0].lx=X; line[0].rx=X; line[0].h=Y; for(int i=1;i<=N;i++) scanf("%d%d%d",&line[i].lx,&line[i].rx,&line[i].h); sort(line,line+N+1); dp[0][0]=line[0].h; dp[0][1]=line[0].h; for(int i=1;i<=N;i++){ //计算第i个板子往左的时间 int j=i-1; while(j>=0&&(line[i].lx>line[j].rx||line[i].lx<line[j].lx)) j--; if(j==-1){ if(line[i].h>MAX) dp[i][0]=INF; else dp[i][0]=line[i].h; } else{ if(line[i].h-line[j].h>MAX){ dp[i][0]=INF; } else{ int rt=INF,lt=INF; if(dp[j][0]!=INF&&line[i].h-line[j].h<=MAX) lt=dp[j][0]+line[i].lx-line[j].lx+line[i].h-line[j].h; if(dp[j][1]!=INF&&line[i].h-line[j].h<=MAX) rt=dp[j][1]+line[j].rx-line[i].lx+line[i].h-line[j].h; dp[i][0]=min(lt,rt); } } //计算往右走的时间 j=i-1; while(j>=0&&(line[i].rx>line[j].rx||line[i].rx<line[j].lx)) j--; if(j==-1){ if(line[i].h>MAX) dp[i][1]=INF; else dp[i][1]=line[i].h; } else{ if(line[i].h-line[j].h>MAX) dp[i][1]=INF; else{ int rt=INF,lt=INF; if(dp[j][0]!=INF&&line[i].h-line[j].h<=MAX) lt=dp[j][0]+line[i].rx-line[j].lx+line[i].h-line[j].h; if(dp[j][1]!=INF) rt=dp[j][1]+line[j].rx-line[i].rx+line[i].h-line[j].h; dp[i][1]=min(rt,lt); } } } printf("%d\\n",min(dp[N][1],dp[N][0])); } }
以上是关于POJ 1661 Help Jimmy的主要内容,如果未能解决你的问题,请参考以下文章