CSP-S2019-day2

Posted Ariel_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSP-S2019-day2相关的知识,希望对你有一定的参考价值。

CSP-S2019-day2

dp专场?! /jk

pts: 64

T1: 64

T2: 0/20

T3: 0

T1

[CSP-S2019] Emiya 家今天的饭

数论,数学,容斥,dp

solution

32pts: 直接暴力枚举,选哪些食材,并判断某类食材是否超标就好了 代码

48pts: 考虑 \\(m = 2\\) 的情况,只有两种食材,所以每种食材选的次数必须相等,直接 \\(dp\\)\\(f[i][j][k]\\) 表示当时正在决策的烹饪方法,选了 \\(j\\) 个食材一和 \\(k\\) 个食材二的方案数代码

64pts: 考虑\\(m = 3\\) 的情况,和 \\(m = 2\\) 的情况一个样,

84pts: 对于一种做菜方案,最多只有一种主要食材在超过\\(\\lfloor\\frac{k}{2}\\rfloor\\)道菜中出现过。因此考虑将答案转化为计算总不合法方案数,用总方案数减去不合法方案数即可

于是便有了一个 \\(O(mn^3)\\) 的做法:枚举主要食材,\\(f[i][j][k]\\) 表示前 \\(i\\) 种烹饪方式中包含\\(j\\) 道主要食材,有 \\(k\\) 种烹饪方式没有使用的方案数,\\(dp\\) 即可。

100pts: 如果 \\(t>\\lfloor\\frac{k}{2}\\rfloor\\)\\(2*t>k\\) ,得 \\(2*t+(n-k)>n\\)

因此可以将原来使用某种主要食材的菜看做使用了两次该食材,并为每种烹饪方式加一种名叫 “不选” 的菜,其使用了所有的主要食材各一次,所有使用某种主要食材大于 \\(n\\) 次的方案即为不合法方案 代码

T2

[CSP-S2019] 划分

贪心,单调队列,dp

solution

32pts: 最后忘了把调试输出的 \\(F\\) 删掉因此爆 0/kk 很简单的一个 dp, \\(f[i][j]\\) 表示到第 \\(i\\) 个数,上一个次在 \\(j\\) 点划分的最大方案;

转移: \\(f[i][j] = min(f[j][k] + (sum[i] - sum[j]) * (sum[i] - sum[j]))\\)

条件:\\(sum[i] - sum[j] > sum[j] - sum[k]\\)

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

64pts: 发现 \\(k\\) 的作用只是判断转移过来的状态合不合法,所以我们可以再开一个数组把这一维滚掉,\\(last[i]\\) 表示到 \\(i\\) 到上一个端点 \\(j\\) 之间的和,\\(last\\) 可以在转移的时候可以顺便求出来 代码

时间复杂度:\\(O(n^2)\\)

100pts: 贪心发现段分的越多答案越小,\\(f[i]\\) 表示到 \\(i\\) 点前的最后一个端点,显然要使得 \\(f[i]\\) 尽可能的靠近 \\(i\\)

\\(f_i\\) 一定是单调不降的,合法的条件为 \\(sum_i - sum_j\\geq sum_j - sum_{f_j}\\),可以变形为 \\(sum_i\\geq sum_j+(sum_j-sum_{f_j})\\) 根据题意,\\(sum_j-sum_{f_j}\\)\\(sum_j\\) 具有单调性。显然,这可以用单调队列来维护 \\(f_i\\) 的值 代码

复杂度 \\(O(n)\\)

T3

[CSP-S2019] 树的重心

树形 dp

solution

以上是关于CSP-S2019-day2的主要内容,如果未能解决你的问题,请参考以下文章

[ROI 2019 Day2]课桌

CSP-S 2019 游记

csp-s模拟测试92

csp-s模拟测试96

反省——关于csp-s模拟50

csp-s模拟测试97