您的位置:首页 > 其它

POJ 1661 Help Jimmy

2016-06-22 10:59 281 查看
点击打开链接

#include <iostream>
#include <algorithm>
using namespace std;
const int M =21000;
const int Inf=1<<30;

typedef struct{
int X;
int Y;
int H;
}Node;
Node node[M];
int n;
bool operator<(const Node a,const Node b)
{
return a.H>b.H;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int x,y,MAX;
cin>>n>>x>>y>>MAX;
int R[M],L[M];// R[i] 从i号平台右端下落到地面的最短时间
node[0].X=node[0].Y=x;
node[0].H=y; // 初始位置

for(int i=1;i<=n;i++)
{
cin>>node[i].X>>node[i].Y>>node[i].H;
}
sort(node,node+n+1);

for(int i=n;i>=0;i--) // 逆推
{
int j;
for(j=i+1;j<=n;j++) // 找 i的左端点下发有plant吗
{
if(node[i].X>=node[j].X&&node[i].X<=node[j].Y)
{
break;
}
}
if(j>n)
{
if(node[i].H>MAX)
{
L[i]=Inf;
}
else
L[i]=node[i].H;
}
else
{
int k=node[i].H-node[j].H;
if(k>MAX) L[i]=Inf;
else
L[i]=min(node[i].X-node[j].X+L[j],node[j].Y-node[i].X+R[j])+k; // dp到J后选择方向
}
for(j=i+1;j<=n;j++) // 找 i的右端点下发有plant吗
{
if(node[i].Y>=node[j].X&&node[i].Y<=node[j].Y)
{
break;
}
}
if(j>n)
{
if(node[i].H>MAX)
{
R[i]=Inf;
}
else
R[i]=node[i].H;
}
else
{
int k=node[i].H-node[j].H;
if(k>MAX) //
R[i]=Inf;
else
R[i]=min(node[i].Y-node[j].X+L[j],node[j].Y-node[i].Y+R[j])+k; // dp:到J后选择方向
}

}
int ans=min(L[0],R[0]);
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: