历届 CSP 刷题记录

news/2024/10/22 19:56:24

\(\texttt{CSP 2019}\)

J 组

\(\texttt{T3}\)

题目传送门

注意到一点:每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。

这告诉我们:在一天内,纪念品就是钱,钱就是纪念品,钱和纪念品没有本质区别,这满足动态规划对于最优化原理和无后效性的要求,可以大胆地购买。

所以可以做如下处理:

把今天手里的钱当做背包的容量

把商品今天的价格当成它的消耗

把商品明天的价格当做它的价值

每一天结束后把总钱数加上今天赚的钱,做 \(t - 1\) 遍完全背包即可。

\(\texttt{T4}\)

题目传送门

题目太过冗杂,转化一下就是:

给定一张无向图,边权都是 \(1\)\(q\) 次询问,每次询问 \(1\)\(a\) 有没有长度为 \(L\) 的的路径。

若递归来做直接 T 飞,其实使用无向图的一个小 tip 就可以快速想出正解。

重要 tip:无向图的每一条边都是一个长度为 \(2\) 的环,所以可以一直在两个点之间转圈圈,再走到终点。

所以先求出 \(1\) 到各点的最短路,若 \(L\le dist_a\),就一定不行,接着再考虑转圈圈能否可以使路径长度为 \(L\)

注意到环的长度为 \(2\),所以可以从奇偶性的角度来思考。

求出 \(1\) 到各点的长度为奇数和偶数的最短路,偶数为 \(0\),奇数为 \(1\)。若 \(L\) 为奇数且 \(dist[a][1]\le l\) 就行,否则不行,偶数同理。

S 组

\(\texttt{CSP 2020}\)

J 组

\(\texttt{T4}\)

题目传送门

一眼 dp,先确定阶段,因为竖着可以上下走,横着只能往右走,所以将列数作为阶段,放在循环最外层。

但竖着有两个方向,不满足后效性怎么办?

想到了这道题,它也是有两个方向走。

借用这道题的思想,设置一个 \(0/1\) 状态机。

\(dp_{i, j, 0}\) 表示从下往上到达 \((i, j)\) 能获得的最大数值,\(dp_{i, j, 1}\) 表示从上往下到达 \((i, j)\) 能获得的最大数值。

接下来就可以写出状态转移方程:

\(dp_{i, j, 0} = \max(dp_{i + 1, j, 0},\max(dp_{i, j - 1, 0}, dp_{i, j - 1, 1})) + a_{i, j}\)

\(dp_{i, j, 1} = \max(dp_{i - 1, j, 1},\max(dp_{i, j - 1, 0}, dp_{i, j - 1, 1})) + a_{i, j}\)

最后的结果即为 \(\max(dp_{n, m, 0}, dp_{n, m, 1})\)

发现计算 \(j\) 时只会用到 \(j - 1\),所以可以滚动数组滚掉一维。

\(\texttt{update on 2024.10.09:}\)

发现今天刚好是做这道题的一周年,但是挫折重重……

这道题需要处理的细节比较多:

  1. 第一列和最后一列都只能往下走,所以状态转移方程有些不同,要单独拎出来求;

  2. \((1, 2)\) 只能从左径直走来或从下走过来,而其他列的第一个可以从左下走来或、左边径直走来或从下走来,所以应该这么写:

if(i > 2) dp[i][1][1] = max(dp[i - 1][1][0], dp[i - 1][1][1]) + a[1][i];
else dp[i][1][1] = dp[i - 1][1][1] + a[1][i];

而除第一列和最后一列之外每一列的最后一行都可以从左边径直走来、左上走来或从上走来,所以可以这么写:

dp[i][n][0] = max(dp[i - 1][n][0], dp[i - 1][n][1]) + a[n][i];
  1. 加滚动数组时要注意以下 hack 数据:
1 1
1

把最后一句改成:

printf("%lld", max((ll)a[m][n], max(dp[m & 1][n][0], dp[m & 1][n][1])));

即可。

(一年前的我不会这道题看题解过的)

S 组

\(\texttt{T1}\)

题目传送门

\(\texttt{T2}\)

题目传送门

\(\texttt{CSP 2021}\)

J 组

S 组

\(\texttt{CSP 2022}\)

J 组

S 组

\(\texttt{CSP 2023}\)

J 组

\(\texttt{T4}\)

题目传送门

同余最短路入坑题。

分析题意,发现到达每个点的时间必定是 \(\lambda k + b (b < k)\),因为可以晚 \(k\) 的非负整数倍秒出发,所以解的集合是无限的,不妨考虑集合的划分,换个说法,就是动态规划。

其实这种有关同余的题目见多之后,条件反射根据它来划分集合。具体地,因为 \(b < k\),而又有 \(k\le 100\),所以从此入手,从状态机的角度来思考,可以给每个点设计 \(100\) 种状态。

\(dist_{u, r}\) 表示从 \(1\) 号点走到点 \(u\) 的最短时间模 \(k\) 等于 \(r\) 时,最短时间为多少。

这道题最毒瘤的一点就是每条边都有时间限制,其实解决方法也很简单:如果在计算过程中发现当前时间小于这条路的开放时间,那么我们就晚一点出发,使得走到这里时刚好能够通过,形式化地:当走到点 \(u\) 时,当前时间为 \(t\),而 \(t < edge\),那么就晚 \(\mu k\) 秒出发,使得到达 \(u\) 的时间变成 \(t + \mu k\),且满足 \(t + \mu k \ge edge,t + (\mu - 1)k < t\)

这里有一个细节:虽然边权都是 \(1\),但并不能用 bfs 来扩展,因为根据我们对 \(dist\) 的定义,每次需要贪心地寻找一个时间最小的点来扩展,所以要使用 dijkstra 来扩展。

最终答案就是 \(dist_{n, 0}\)

最后不要忘了无解输出 \(-1\)

S 组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74775.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Nacos K8s

Nacos 是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 是构建以服务为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。更多的功能特性介绍请查看 Nacos 概览。 在本文…

RocketMQ - 总结

1. 为什么要使用MQ,使用场景是什么异步 : 减少请求响应时间,实现非核心流程异步化 (架构设计原则,能异步就不要同步) 解耦:屏蔽异构平台的细节,生产者消费者可自行扩展修改系统能力只需遵循消息约束,生产者消费者不受对方影响 流量削峰:消息堆积能力,消息保存在MQ中,…

数据采集作业一

一、用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020)的数据,屏幕打印爬取的大学排名信息点击查看代码 # 目标网址 url = "http://www.shanghairanking.cn/rankings/bcur/2020"# 获取网页内容 response = url…

PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展

检查并开启 sqlite3 扩展打开 PHPStudy Pro 软件。 导航至设置 -> 配置文件 -> php.ini。 选择你当前使用的 PHP 版本(例如 php7.3.4nts)并点击打开 php.ini 文件。 在 php.ini 文件中搜索 extension=sqlite3。 如果该行被注释掉(前面有分号 ;),则去掉分号以启用扩展…

PbootCMS上传空间后前台打开内页显示404错误怎么解决

检查 URL 规则配置登录 PbootCMS 后台。 导航至 配置参数 -> URL规则。 选择 伪静态模式 并保存。添加伪静态规则根据你的服务器环境,选择合适的伪静态规则文件。 一般情况下,Apache 环境使用 .htaccess 文件。Apache 环境配置将 rewrite 文件夹中的 .htaccess 文件复制到…

例题2.3

例题2.3代码 L = [abc, 12, 3.45, python, 2.789] print(L) print(L[0]) L[0] = a L[1:3] = [b, Hello] print(L) L[2:4] = [] print(L)

习题2.5

习题2.5代码 import numpy as np import pandas as pd import sympy as sp sp.init_printing(use_unicode=True) import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[Times New Roman + SimSun + WFM Sans SC] plt.rcParams[mathtext.fontset]=cm Times New Roma…

高等数学 7.7常系数齐次线性微分方程

在二阶齐次线性微分方程 \[y + P(x)y + Q(x)y = 0 \tag{1} \]中,如果 \(y, y\) 的系数 \(P(x), Q(x)\) 均为常数,即 \((1)\) 式成为 \[y + py + qy = 0 \tag{2} \]其中 \(p, q\) 是常数,那么称 \((2)\) 为二阶常系数齐次线性微分方程。如果 \(p, q\) 不全为常数,就称 \((1)…