NOIP模拟测试A2
好像是去年 8 月 1 日的模拟赛,主题采自南昌起义。
背景

A. 南
一道可爱的期望 DP。
一般来说,期望 DP 都是逆推,从最终状态往前推,这题也不例外。
这道题难度主要在于,第 \(k\) 次购买的价格为 \(k\),即价格与购买次数有关。
那我们就不能直接进行转移了,而是需要根据期望次数进行转移。
所以我们定义 \(f[i]\) 为已经获得 \(i\) 种武器,想要获得 \(n\) 种武器的期望次数。
初始状态 \(f[n] = 0\),即已经获得 \(n\) 种武器后想要取完 \(n\) 种武器的期望次数为 \(0\)。
\(f[i]\) 的转移还是很容易能想到的,分两种情况处理。
- 买到了已经有的类型,得到 \(f[i] = f[i] + 1\),已经获得的武器种类数保持不变,仍然为 \(i\)。
- 买到之前没有的类型,得到 \(f[i] = f[i+1]+1\),拥有的武器种类数增加了 \(1\)。
于是我们得到式子:
\]
这个式子可以化简
\]
定义 \(g[i]\) 为已经获得 \(i\) 种武器,想要获得 \(n\) 种武器的期望钱数。
同理,初始状态为 \(g[i] = 0\),仍然分取到已经有的和取到没有的两种情况处理。
\]
每次加的钱数都是在上一次的基础上加了 \(1\),无论是买到已获得的还是未获得的。
这个式子仍然可以化简:
\]
Code:
for(int i = n - 1;i >= 0; i--)
f[i] = f[i + 1] + (double)n / (double)(n - i);
for(int i = n - 1;i >= 0; i--)
g[i] = (double)i / (double)(n - i) * f[i] + g[i + 1] + f[i + 1] + (double)n / (double)(n - i);
B. 昌
要求根结点的最大值。
我们先假设根结点的最大值大于等于 \(x\),那么对于 \(\text{min}\) 操作来说,儿子的权值必须都大于等于 \(x\);对于 \(\text{max}\) 操作来说,儿子的权值至少要有一个大于等于 \(x\)。
依次类推,我们就可以找到这棵树有多少叶子结点的权值需要大于等于 \(x\),设这个值为 \(cnt\),那么 \(x\) 的最大值就是 \(k - cnt + 1\),\(k\) 为叶子个数。
所以我们可以求出来 \(cnt\),用它来求 \(x\)。
设 \(f[u]\) 为以 \(u\) 为根的子树内,至少有 \(f[u]\) 个叶子结点需要大于某个值。
对于叶子结点,有 \(f[u] = 1\)。
对于 \(\text{max}\) 操作:\(f[u] = \text{min}_{v \in son[u]}f[v]\)
对于 \(\text{min}\) 操作:\(f[u] = \Sigma_{v \in son[u]} f[v]\)
(对应的就是最开始那几句)
最终答案为 \(k - f[1] + 1\)。
Code:
void dfs(int x) {
if(e[x].empty()) {
dp[x] = 1;
return;
}
if(a[x] == 1) {
dp[x] = INT_MAX >> 1;
for(int i : e[x]) {
dfs(i);
dp[x] = min(dp[x],dp[i]);
}
} else {
dp[x] = 0;
for(int i : e[x]) {
dfs(i);
dp[x] += dp[i];
}
}
}
C. 起
不想写了,挂个官方题解


D. 义
好像是根号分治。
一个没听说过的东西,考后查了查,是一种思想,将要处理的整体分为前 \(\sqrt{n}\) 和剩余部分分别处理。
在这道题里十分的明显。
对于前 \(\sqrt{n}\) 种物品,每一种物品都有取完的可能。
但对于 \(\sqrt{n} + 1\) 到 \(n\) 种物品,如果把物品取完,就会超过背包容量,所以物品都取不完,相当于物品数量是无穷的。
所以我们可以分开进行 DP。
对于前 \(\sqrt{n}\) 种物品,定义 \(f[i][j]\) 为取完第 \(i\) 种物品,背包容量已经用 \(j\)。
有
\]
假设有一条线段,表示我们背包的容量。
\(f[i-1][j]\) 表示不拿 \(i\) 物品,\(f[i][j-i]\) 表示再拿一个 \(i\) 物品,要减去多拿的方案数。

对于 \(f[i][j]\),是由 \(f[i][j - i]\) 转移而来的,\(f[i][j - i]\) 是由 \(f[i][j - 2i]\) 转移而来,但显然,不能拿 \(i(i+1)\) 个或以上,所以需要减去这部分。
再考虑剩下的部分,定义 \(g[i][j]\) 表示拿了 \(i\) 件 \(\sqrt{n} + 1\) 到 \(n\) 的物品,使用背包容量为 \(j\),有
\]
表示每个物品都增加 \(1\) 的容量,变成下一种物品,就是不拿第 \(\sqrt{n} + 1\) 种物品
\]
表示拿一个第 \(\sqrt{n} +1\) 种物品。
最后把两个数组的方案数相乘相加。
Code:
m = sqrt(n);
f[0][0] = f[1][0] = 1;
int k = 0;
for (int i = 1; i <= m; i++) {
k ^= 1;
for (int j = 1; j <= n; j++) {
f[k][j] = f[k ^ 1][j];
if (j >= i)
f[k][j] = (f[k][j] + f[k][j - i]) % MOD;
if (j >= i * (i + 1))
f[k][j] = (f[k][j] - f[k ^ 1][j - i * (i + 1)] + MOD) % MOD;
}
}
g[0][0] = 1;
for (int i = 0; i <= m; i++)
for (int j = 0; j <= n; j++) {
if (j + i <= n && i)
g[i][j + i] = (g[i][j + i] + g[i][j]) % MOD;
if (j + m + 1 <= n)
g[i + 1][j + m + 1] = (g[i + 1][j + m + 1] + g[i][j]) % MOD;
}
g[1][0] = 1;
for (int i = 0; i <= n; i++)
for (int j = 1; j <= m; j++)
ans = (ans + 1ll * f[k][i] * g[j][n - i] % MOD) % MOD;
NOIP模拟测试A2的更多相关文章
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
- 2019.7.29 NOIP模拟测试10 反思总结【T2补全】
这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...
- NOIP模拟测试1(2017081501)
好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
随机推荐
- 10分钟极速入门dash应用开发
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master 大家好我是费老师,几天前我发布了由我开源维护的dash通用网页组件库fac的0 ...
- [Pytorch框架] 1.1、Pytorch简介
文章目录 1.1 Pytorch 简介 1.1.1 PyTorch的由来 1.1.2 Torch是什么? 1.1.3 重新介绍 PyTorch 1.1.4 对比PyTorch和Tensorflow 1 ...
- 云原生时代崛起的编程语言Go基础实战
@ 目录 概述 定义 使用场景 Go 安全 使用须知 搜索工具 Go基础命令 标准库 基础语法 Effective Go 概览 命名规范 注释 变量 常量(const) 控制结构 数据类型 迭代(ra ...
- 2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处。若小球在编号为 i 的弹
2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处.若小球在编号为 i 的弹 ...
- 2021-04-16:摆放着n堆石子。现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。求出将n堆石子合并成一堆的最小得分(或最大得分)合
2021-04-16:摆放着n堆石子.现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.求出将n堆石子合并成一堆的最小得分(或最大得分)合 ...
- 2021-10-01:矩阵置零。给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。进阶:一个直观的解决方案是使用 O(mn) 的额外空间
2021-10-01:矩阵置零.给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法.进阶:一个直观的解决方案是使用 O(mn) 的额外空间, ...
- 记一次 .NET 某医院门诊软件 卡死分析
一:背景 1. 讲故事 前几天有位朋友找到我,说他们的软件在客户那边卡死了,让我帮忙看下是怎么回事?我就让朋友在程序卡死的时候通过 任务管理器 抓一个 dump 下来,虽然默认抓的是 wow64 ,不 ...
- java通用xls导出设计
背景 在后端日常开发中总会有各种各样的导出需求,实现这个需求必须要解决的两个问题: 1.表头不能直接使用字段名,需要显示为中文,甚至还需要考虑国际化 2.值需要翻译,比如性别.状态之类的字段 现状 现 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-1-环境准备与搭建
1.简介 有很多人私信留言宏哥问能不能介绍一下Playwright这款自动化神器的相关知识,现在网上的资料太少了.其实在各大博客和公众号也看到过其相关的介绍和讲解.要不就是不全面.不系统,要不就是系统 ...
- 2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?
2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline? 答案2023-06-03: Redis客户端执行一条命令通常包括以下四个阶段: 1.发送命令:客户端将要执 ...