这是找的倒数第二简单的,然而依旧不会,泪~ 昨天晚上调出来发现是(以示例为例)从倒数第二个平台直接跳下去 时间是0;从上面第一个跳下去 时间依旧是0 orz 12点半躺床上顿悟应该每个平台的时间不仅是一个,有左右两个时间 (唯一值得欣慰是发现了:dp值里面不用加上高度下落的时间差,最后dp[]+下落的高度,总共加一次就好,毕竟下落一定需要时间,又不能往上跳,那么总的下落时间是一定的,只需要考虑左右走的时间即可)
今天早上又纠结了一上午:对于一个平台,当然要么向左走,跳下去;要么向右走,跳下去。但是对于下面的平台,可能由上不止一个平台掉下来,那么位置就不同导致数值不同。凌乱ing ㄟ( ▔, ▔ )ㄏ 自己也有想到某平台上的某点到达左右边界的时间可以递归求出,无疑题解中的算法更好:dp数组只表示此平台的“左右端点”下落到地面的时间,很好的解决了上述问题
最后一合计 8+13>2+17 所以输出23
/*******
poj1661
2015.12.18
172K 0MS C++ 1625B
*******/
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 1000000
struct Platform
{
int lx,rx,h;
}p[1010]; // 注意数组大小,要不会WA
int leftmin[1010];
int rightmin[1010];
int n,MAX;
bool cmp(Platform a,Platform b)
{
return a.h>b.h;
}
int mintime(int L,int flag)
{
int y = p[L].h;
int i,x,ltime,rtime;
if( flag )
x = p[L].lx;
else
x = p[L].rx;
for(i=L+1; i<=n; i++)
{
if( p[i].lx<=x && p[i].rx>=x)
break;
}
if( i<=n )
{
if( y - p[i].h > MAX )
return INF;
}
else
{
if( y > MAX )
return INF;
else
return y;//没有板子
}
ltime = y - p[i].h + x - p[i].lx;
rtime = y - p[i].h - x + p[i].rx;
if( leftmin[i] == -1 )
leftmin[i] = mintime(i,1);
if( rightmin[i] == -1 )
rightmin[i] = mintime(i,0);
ltime += leftmin[i];
rtime += rightmin[i];
if( ltime < rtime ) //判断左边时间和右边时间
{
return ltime;
}
else
{
return rtime;
}
}
int main()
{
freopen("cin.txt","r",stdin);
int i,ncases,x,y;
scanf("%d",&ncases);
while(ncases--)
{
scanf("%d %d %d %d",&n,&x,&y,&MAX);
memset(leftmin,-1,sizeof(leftmin));
memset(rightmin,-1,sizeof(rightmin));
p[0].lx = x;
p[0].rx = x;
p[0].h = y;
for(i=1; i<=n; i++)
scanf("%d%d%d",&p[i].lx,&p[i].rx,&p[i].h);
sort(p+1,p+1+n,cmp); //快排,按板子高度从高到低排
printf("%d\n",mintime(0,1));
for(int i=0;i<=n;i++)
printf("i=%d left=%d right=%d\n",i,leftmin[i],rightmin[i]);
}
return 0;
}