POJ1661
POJ1661题目链接
题意就是一个小人在最高的平台上选择向左或者向右走,每秒的行走速度和下降速度都是1,有一个最长的下降的距离,超过这个距离就会GG,求最小时间
由于小人只能选择从左侧下降或者从右侧下降,我们只要设置两个下降状态,然后按照高度排序从下向上一下就可以了
设置
设置
然后从低到高进行更新就可以了。具体实现看代码。
POJ1661代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn = 1005;
const int INF = 0x3f3f3f3f;
struct data
{
int l,r,h;
}x[maxn];
int dp[2][maxn];
bool cmp(const data &a,const data &b)
{
if(a.h==b.h) return a.l<=b.l;
return a.h<b.h;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,X,Y,maxx;
scanf("%d%d%d%d",&n,&X,&Y,&maxx);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&x[i].l,&x[i].r,&x[i].h);
}
for(int i=0;i<=n+1;i++)
{
dp[0][i]=INF;
dp[1][i]=INF;
}
sort(x+1,x+1+n,cmp);
x[n+1].l=X;
x[n+1].r=X;
x[n+1].h=Y;
for(int i=1;i<=n+1;i++)
{
for(int j=i-1;j>=1;j--)
{
if(x[i].h-x[j].h<=maxx&&x[i].h>x[j].h)
{
if(x[j].l<=x[i].l&&x[i].l<=x[j].r)
{
dp[0][i]=min(dp[0][i],x[i].h-x[j].h+min(dp[0][j]+x[i].l-x[j].l,dp[1][j]+x[j].r-x[i].l));
break;
}
}
}
if(dp[0][i]==INF)
{
if(x[i].h>maxx) dp[0][i]=INF;
else dp[0][i]=x[i].h;
}
for(int j=i-1;j>=1;j--)
{
if(x[i].h-x[j].h<=maxx&&x[i].h>x[j].h)
{
if(x[j].l<=x[i].r&&x[i].r<=x[j].r)
{
dp[1][i]=min(dp[1][i],x[i].h-x[j].h+min(dp[0][j]+x[i].r-x[j].l,dp[1][j]+x[j].r-x[i].r));
break;
}
}
}
if(dp[1][i]==INF)
{
if(x[i].h>maxx) dp[1][i]=INF;
else dp[1][i]=x[i].h;
}
}
printf("%d\n",min(dp[0][n+1],dp[1][n+1]));
}
return 0;
}