【POJ 1661】Help Jimmy

版权声明:虽然我很菜,不过转载请标明出处。 https://blog.csdn.net/Patrickpwq/article/details/86586243

萌新冒泡

由于“是男人就下一百层” 使得这道题很形象 然后写的时候思路就会非常顺畅啦 我虽然还是个菜鸟 都能一遍AC

总的来说 我们记f[i][0] 表示到达第i块板子左端点所需最少时间 同理f[i][1]为右端点

可以先预处理出每块板子左右端点所对应的是那块板子

然后当前板子从左端点可以转移到所对应板子的左边或者右边 右端点同理

#include<iostream>
#include<cstring>
#include<algorithm>
const int N=1005;
const int INF=0x3f3f3f3f;
using namespace std;
int n,x,y,k,st;
struct Node
{
	int l,r,h;
	friend istream&operator >>(istream &in,Node &p)
	{
		in>>p.l>>p.r>>p.h;
		return in;
	}
	bool operator <(const Node &p) const
	{
		if(this->h==p.h)	return this->l<p.l;
		else return this->h>p.h;	 
	}
}a[N];
int down[N][2],f[N][2];	//0 左端点 1 右端点 
void Init()
{
	memset(f,0x3f,sizeof(f));
	memset(a,0,sizeof(a));
	memset(down,0,sizeof(down));
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		Init();
		cin>>n>>x>>y>>k;
		for(int i=1;i<=n;i++)	cin>>a[i];
		sort(a+1,a+n+1);
		for(int i=1;i<=n;i++)
		{
			if(x>=a[i].l&&x<=a[i].r)
			{
				st=i;
				f[i][0]=y-a[i].h+x-a[i].l;
				f[i][1]=y-a[i].h+a[i].r-x;
				break;
			}	
		}
		for(int i=st;i<=n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				if(a[j].h<a[i].h&&a[j].l<=a[i].l&&a[j].r>=a[i].l)	
				{
					down[i][0]=j;
					break;
				}
			}
			for(int j=i+1;j<=n;j++)
			{
				if(a[j].h<a[i].h&&a[j].l<=a[i].r&&a[j].r>=a[i].r)	
				{
					down[i][1]=j;
					break;
				}
			}
		}
	//	for(int i=1;i<=n;i++)	cout<<down[i][0]<<" "<<down[i][1]<<endl;
		int ans=INF;
		for(int i=st;i<=n;i++)
		{
			//对于一个板子 可以从左端点跳或者右端点
			//左端点
			int lx=down[i][0],rx=down[i][1];
			if(lx==0)
			{
				if(a[i].h<=k)	
					ans=min(ans,f[i][0]+a[i].h);
			}
			if(rx==0)
			{
				if(a[i].h<=k)
					ans=min(ans,f[i][1]+a[i].h);
			}
			if(a[i].h-a[lx].h<=k)	//不会摔死 
			{
				f[lx][0]=min(f[lx][0],f[i][0]+a[i].l-a[lx].l+a[i].h-a[lx].h);
				f[lx][1]=min(f[lx][1],f[i][0]+a[lx].r-a[i].l+a[i].h-a[lx].h);
			}
			if(a[i].h-a[rx].h<=k)
			{
				f[rx][0]=min(f[rx][0],f[i][1]+a[i].r-a[rx].l+a[i].h-a[rx].h);
				f[rx][1]=min(f[rx][1],f[i][1]+a[rx].r-a[i].r+a[i].h-a[rx].h);
			}
		}
		if(ans==INF)	cout<<y<<endl;
		else cout<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Patrickpwq/article/details/86586243