Luogu P3336

发布时间 2023-04-24 19:44:06作者: untitled0

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

初中平几课堂开课啦

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

\(A\) 是当前点,点 \(B\) 是前一个点,点 \(C\) 是这个路径能到达的最高点,设 \(A\) 坐标是 \((x_1,y_1)\)\(B\) 坐标为 \((x_0,y_0)\)

容易得出:

\[\because AD=x_1-x_0,BD=y_1-y_0=DE \]

\[\therefore AE=(x_1-x_0)-(y_1-y_0)=x_1-x_0+y_0-y_1 \]

\[\therefore CF=\frac{1}{2}AE=\frac{x_1-x_0+y_0-y_1}{2} \]

\[\therefore y_C=y_1+CF=\frac{x_1-x_0+y_0+y_1}{2} \]

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

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

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

18 3
2 2
4 2
12 6

ans:
1 6

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

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

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

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

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

那么何时不能往上走呢?

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

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

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

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

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