向玄学低头orz。
#include <stdio.h>
struct platform //记录每个平台的状态,左右端位置,高度以及从该平台左右端出发到达地面的最短可能时间
{
int left,right,height,lefttime,righttime;
};
typedef struct platform platform;
int min(int a,int b)
{
return a<b?a:b;
}
int times,max,n;
platform platforms[1001];
int mintime(int layer,int dir)//这个函数的功能是求出从layer层按dir方向的最小可能,0为左,1为右//返回值是最小可能
{
int a,i;
if(dir)
a=platforms[layer].right;
else
a=platforms[layer].left;
for(i=layer+1;i<=n;i++)
if(platforms[i].left<=a&&a<=platforms[i].right)
break;
if(i==n+1)//直接面对地面的情况
{
if(platforms[layer].height<=max)
return platforms[layer].height;
else return 1000000;
}
else
{
if(platforms[layer].height-platforms[i].height<=max)
{
if(platforms[i].lefttime==-1)
platforms[i].lefttime=mintime(i,0);
if(platforms[i].righttime==-1)
platforms[i].righttime=mintime(i,1);
return platforms[layer].height-platforms[i].height+min(platforms[i].lefttime+a-platforms[i].left,platforms[i].righttime+platforms[i].right-a);
}
else
return 1000000;
}
}
int main()
{
int i,j,k;
scanf("%d",×);
for(i=0;i<times;i++)
{
scanf("%d%d%d%d",&n,&platforms[0].left,&platforms[0].height,&max);
platforms[0].right=platforms[0].left;
for(j=1;j<=n;j++)
scanf("%d%d%d",&platforms[j].left,&platforms[j].right,&platforms[j].height);
for(j=1;j<=n;j++)//将平台从高到低排列
{
platform tmp;
for(k=j+1;k<=n;k++)
if(platforms[j].height<platforms[k].height)
{
tmp=platforms[j];
platforms[j]=platforms[k];
platforms[k]=tmp;
}
}
for(j=0;j<=n;j++)
platforms[j].lefttime=platforms[j].righttime=-1;
platforms[0].lefttime=mintime(0,0);
platforms[0].righttime=mintime(0,1);
printf("%d\n",min(platforms[0].lefttime,platforms[0].righttime));
}
return 0;
}