Luogu P3336

题面

因为我也是看了大佬的题解才写的(第一问),自认为自己讲得不可能比他们再好了,但是因为好多第二问的题解都被hack了,所以这里详细讲一下第二问的正确做法。

初中平几课堂开课啦

其实思路很简单,利用贪心的思想,能往上走就往上走,能走多高就走多高,来看这个图:

A 是当前点,点 B 是前一个点,点 C 是这个路径能到达的最高点,设 A 坐标是 (x1,y1)B 坐标为 (x0,y0)

容易得出:

AD=x1x0,BD=y1y0=DE

AE=(x1x0)(y1y0)=x1x0+y0y1

CF=12AE=x1x0+y0y12

yC=y1+CF=x1x0+y0+y12

第二问答案就是所有 C 的最大值,即:

maxn=max(maxn,(x1-x0+y0+y1)>>1);

但是,需要注意的是,如果在 B不能往上走,上面的公式就不好用了,比如这个hack:

18 3
2 2
4 2
12 6

ans:
1 6

画出来唯一解法是这样的:

但如果我们按上面的方法做,第二问的答案会是8,为什么呢?

如果我们仍按以上方法算,第二问会被认为这样的:

但显然这是错的,因为不满足题目所要求的函数极小值为 0

分析产生这种情况的原因:在计算第二问的时候,没有考虑到前一个点不能往上走的情况

那么何时不能往上走呢?

也很简单,因为我们之前设 fi,0/1 为第 i 个点上升/下降的方案数,则第 i 个点不能上升就是 fi,0=0 的情况。

那么如果它不能上升,我们就让它下降到 0 ,以这个点作为我们之前分析的 B 点,即:

if(!f[i-1][1])x0=x0+y0,y0=0;

这样第二问就结束了。第二问本身不难,但问题出在没有把情况像第一问一样考虑全,导致一些想当然的错误做法,因此告诫自己:

一定要在考虑问题时思考全面,实在不行把所有可能性罗列出来!

posted @   untitled0  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示