题解 P1156 【垃圾陷阱】洛谷

P1156 垃圾陷阱

这不是DP,不是DFS

这里是BFS

为什么采用BFS?

因为蒟蒻不会DP/DFS

因为BFS思路像DFS一样简单,复杂度可以像DP一样小

只需小小的优化:

决定第i个垃圾后:

由于生命值越大,离井口高度越小才可能是最优解

所以上图中除了已经标出的点之外,永远不可能取得最优解

那么剩下的点都可删去

离井口的高度 ∈ [ 0 , D ] \in[0,D] [0,D]

时间复杂度 Θ ( D G ) \Theta(DG) Θ(DG)

D ∈ [ 2 , 100 ] , G ∈ [ 1 , 100 ] D\in[2,100],G\in[1,100] D[2,100],G[1,100]

只要从右到左,从下到上按高度递减取点即可


堆实现

struct Q{
	int m,t,h;
	bool operator<(const Q x)const{//重载小于号反向
		if(m!=x.m)return x.m<m;
		if(t!=x.t)return x.t>t;
		return x.h<h;
	}
};
priority_queue<Q>q;//大根堆

关键部分

	q.push((Q){0,10,d});
	int maxlive=10,minout=inf;
	int num=0,minh=inf;
	Q tmp;
	for(int i=0;tmp=q.top(),i=tmp.m,!q.empty()&&i<g;)
	{
		q.pop();
		if(a[i].t>tmp.t)continue;//卡门死了,停止
		if(i>num)num=tmp.m,minh=inf;
		if(tmp.h<minh)
		{
			if(tmp.h-a[i].h<=0)//卡门出去了
			{
				minout=a[i].t;
				break;
			}
			q.push((Q){i+1,tmp.t,tmp.h-a[i].h});
			q.push((Q){i+1,tmp.t+a[i].f,tmp.h});
			maxlive=max(maxlive,tmp.t+a[i].f);
			minh=tmp.h;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值