其他分享
首页 > 其他分享> > hzx的CSP-J模拟赛题解

hzx的CSP-J模拟赛题解

作者:互联网

T1

按题意模拟即可,注意不用考虑闰年。

T2

\(30\%\) 的数据:使用 \(Floyd\) 求出图的全源最短路,时间复杂度 \(O(n^3)\)。

\(50\%\) 的数据:对图上每个点使用 \(Dijkstra\) 求出最短路,时间复杂度 \(O(n^2 \log n)\),需要较优秀的常数才能通过。常数十分优秀的 \(Johnson\) 也可获得此部分分,\(SPFA\) 很难取得此部分的全部分数。

\(100\%\) 的数据:任意 \(u_i\) 和 \(w_i\) 互异,\(1 \le w_i \le n\),且图是无向完全图,所以,必然存在一个 \(w_i\) 为 \(1\) 的点与其他点存在连边,所以只需要比较 \(\operatorname{lcm}(w_u,w_v)\) 和 \(w_u+w_v\) 即可,注意判断两点相同,时间复杂度 \(O(T \log n)\)。

\(\text{extra}\):考虑使用 \(\operatorname{lcm}\) 的性质来求解,可将单次询问复杂度降至 \(O(1)\),如果实现常数较大,请使用较快的读写方式。

T3

\(10\%\) 的数据:可以使用随机化算法或单次检查答案。

\(30\%\) 的数据:对随机化进行约束,或者模拟退火,可以获得这部分分。

\(50\%\) 的数据:可以检查所有可能的答案,时间复杂度 \(O(n^2)\)。

\(100\%\) 的数据:看到最小堆的硬币数量最大容易想到二分答案,同时容易发现答案满足单调性。

但是要考虑二分答案的 check 如何书写。

考虑怎么贪心最优秀。

假设现在二分的答案值为 \(ans\) 。

发现对于最后一堆硬币,它不能从别的堆中获得硬币,所以考虑起来比较容易。为了使前面的硬币数量尽可能的多,它应该在满足自己满足 \(\geq ans\) 的前提下给更多的硬币给前面。这个 \(d\) 为 \(\lfloor\frac{h_n-ans}{3}\rfloor\)。

这样子前面的堆的硬币就增加了,假设这时每一堆硬币的个数为 \(b_i\) 。则 \(b_{n-1}=h_{n-1}+\lfloor\frac{h_n-ans}{3}\rfloor\) 则第 \(n-1\) 堆就应该给前面 \(3\times \lfloor\frac{b_{n-1}-ans}{3} \rfloor\) 个硬币。但是由于只能从前往后进行操作,所以最多给 \(3\times\lfloor\frac{h_{n-1}}{3} \rfloor\) 个硬币。

即对于第 \(i\) 堆取 \(3\times\lfloor\frac{\min\{b_i-ans,a_i\}}{3}\rfloor\) 给前面的硬币。

T4

\(10\%\) 的数据:模拟即可。

\(20\%\) 的数据:同上。

\(50\%\) 的数据:题目可以转化为两人同时从左上角走到右下角,考虑 dp,很容易想到设 \(dp[i][j][k][l]\) 表示第一个人在 \(i,j\) 第二个人在 \(k,l\) 能得到的最大值。时间复杂度 \(O(n^4)\)。

\(100\%\) 的数据:我们考虑减少一维,设 \(dp[i][j][k]\) 表示两个人都走了 \(i\) 步,第一个人在第 \(j\) 行,第二个人在第 \(k\) 行的最大值。此时两人的纵坐标是可以算出来的。

第一个人的列为 \(i-j+1\),第二个是 \(i-k+1\)。

时间复杂度 \(O(n^3)\)。

\(zcy\) 的神仙做法我看不懂。

标签:lfloor,frac,硬币,题解,复杂度,rfloor,CSP,ans,hzx
来源: https://www.cnblogs.com/hzx-qwq/p/16644635.html