您的位置:首页 > 运维架构

openjudge help Jimmy

2015-12-07 20:40 323 查看

663:帮助 Jimmy

查看
提交
统计
提问

总时间限制: 1000ms 内存限制: 65536kB

描述"Help Jimmy" 是在下图所示的场景上完成的游戏。



场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。

Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。

设计一个程序,计算Jimmy到底地面时可能的最早时间。

输入第一行是测试数据的组数t(0 <= t <= 20)。每组测试数据的第一行是四个整数N,X,Y,MAX,用空格分隔。N是平台的数目(不包括地面),X和Y是Jimmy开始下落的位置的横竖坐标,MAX是一次下落的最大高度。接下来的N行每行描述一个平台,包括三个整数,X1[i],X2[i]和H[i]。H[i]表示平台的高度,X1[i]和X2[i]表示平台左右端点的横坐标。1 <= N <= 1000,-20000
<= X, X1[i], X2[i] <= 20000,0 < H[i] < Y <= 20000(i = 1..N)。所有坐标的单位都是米。

Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。

输出对输入的每组测试数据,输出一个整数,Jimmy到底地面时可能的最早时间。
样例输入
1
3 8 17 20
0 10 8
0 10 13
4 14 3


样例输出
23


来源POJ Monthly--2004.05.15 CEOI 2000#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

int n,m,i,j,k,t,x,y,maxn;

struct data

{

int x1,x2,y;

};data a[1005];

struct data1

{

int x1,x2;

};data1 f[1005];

int b1[1005][1005],b2[1005][1005];

int tmp,head;

int cmp(data x,data y)

{

return x.y>y.y;

}

int main()

{

scanf("%d",&t);

for (k=1;k<=t;k++)

{

scanf("%d%d%d%d",&n,&x,&y,&maxn);

x+=20000; tmp=0;

for (i=1;i<=n;i++)

{

f[i].x1=2100000000; f[i].x2=2100000000;

}

for (i=1;i<=n;i++)

{

int x1,y1,z1;

scanf("%d%d%d",&x1,&y1,&z1);

if (x1>y1)

swap(x1,y1);

if (z1<=y)

{

tmp++;

a[tmp].x1=x1+20000;

a[tmp].x2=y1+20000;

a[tmp].y=z1;

}

}

n=tmp;

sort(a+1,a+n+1,cmp);

head=1;

while (a[head].x2<x||a[head].x1>x)

head++;

memset(b1,0,sizeof(b1)); memset(b2,0,sizeof(b2));

for ( i=head;i<n;i++)

{

int l=a[i].x1;

int r=a[i].x2;

bool pd=true;

for ( j=i+1;j<=n;j++)

if (l>=a[j].x1&&l<=a[j].x2)

{

b1[i][j]=b1[j][i]=1;

pd=false;

break;

}

if (pd==true)

b1[i][0]=b1[0][i]=1;

pd=true;

for ( j=i+1;j<=n;j++)

if (r>=a[j].x1&&r<=a[j].x2)

{

b2[i][j]=b2[j][i]=1;

pd=false;

break;

}

if (pd==true)

b2[i][0]=b2[0][i]=1;

}

b1
[0]=b1[0]
=1;

b2
[0]=b2[0]
=1;

int sum=y-a[head].y;//这一句不能直接加到f[head].x1和x2中,必须最后加,否则会出错

f[head].x1=x-a[head].x1; f[head].x2=a[head].x2-x;

for (i=head;i<=n;i++)

for (j=head;j<i;j++)

if (a[j].y-a[i].y<=maxn)

{

if (b1[j][i]==1)

{

f[i].x1=min(f[i].x1,f[j].x1+a[j].y-a[i].y+a[j].x1-a[i].x1);

f[i].x2=min(f[i].x2,f[j].x1+a[j].y-a[i].y+a[i].x2-a[j].x1);

}

if (b2[j][i]==1)

{

f[i].x1=min(f[i].x1,f[j].x2+a[j].y-a[i].y+a[j].x2-a[i].x1);

f[i].x2=min(f[i].x2,f[j].x2+a[j].y-a[i].y+a[i].x2-a[j].x2);

}

}

int ans=2100000000;

for (i=n;i>=head;i--)

if (a[i].y<=maxn)

{

if (b1[i][0]==1) ans=min(ans,f[i].x1+a[i].y);

if (b2[i][0]==1) ans=min(ans,f[i].x2+a[i].y);

}

else

break;

ans+=sum;

printf("%d\n",ans);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: