首页 > 其他分享 >历届 CSP 刷题记录

历届 CSP 刷题记录

时间:2024-10-22 19:42:53浏览次数:1  
标签:传送门 max texttt 这道题 历届 CSP dp 刷题

\(\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 组

标签:传送门,max,texttt,这道题,历届,CSP,dp,刷题
From: https://www.cnblogs.com/Brilliant11001/p/18493611

相关文章

  • CSP近四年总结及2024预测
    近四年算法出现频率(按频率排序,且按每年是否出现统计)动态规划dp——\(100\%(\frac{4}{4})\)贪心——\(100\%(\frac{4}{4})\)搜索——\(75\%(\frac{3}{4})\)图论——\(75\%(\frac{3}{4})\)二分——\(50\%(\frac{2}{4})\)基础数据结构——\(50\%(\frac{2}{4})\)......
  • CSP2024 前集训:多校A层冲刺NOIP2024模拟赛11
    前言T1不知道啥是冒泡排序,理解了一会儿题面代码发现是啥意思了于是就签了。后面的题都不是很可做,T2、T4计数,T3高级玩意看不懂。但是T2有点可做,但我的DP不知道哪儿假了,暴力还打挂了,不然加个bitset就操过去了。T1冒泡排序\(i\)只能和\(i+k,i+2k,……\)换,对于每一......
  • 2024 信友队 CSP-J 第二轮(复赛)模拟赛
    A火柴#include<cstdio>intcnt[10]={0,1,2,3,3,2,3,4,5,3};charnum[10][10]={"","I","II","III","IV","V","VI","VII","VIII","IX"};......
  • [DMY]CSP-S 模拟赛 Day 20
    CSP-S前最后一场代码源了。赛时T1看上去是一个很神秘的题目,在纸上推了半天勉勉强强想到一个奇怪的贪心做法。看到数据范围,发现直接做的话会超时,但是考虑到C++内置的sort函数可以帮助优化时间复杂度,所以写了个很丑的神秘排序。发现做完以后只能判断两种特殊情况,思考怎样......
  • P7072 [CSP-J2020] 直播获奖 对顶堆
    对顶堆动态维护第k大的值。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidShowball(){intn,w;cin>>n>>w;priority_queue<int,vector<int>,greater<int>>minq;priority_queue<int>ma......
  • 历年CSP-J初赛真题解析 | 2017年CSP-J初赛完善程序(27-36)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客(快速幂)请完善下面的程序,该程序使用分治法求x......
  • 【关注可白嫖源码】计算机等级考试在线刷题小程序,不会的看过来
    设计一个计算机等级考试在线刷题小程序,需要确保系统能够提供高效的刷题功能,帮助用户随时随地练习。以下是系统的设计思路:一、系统设计总体思路该小程序需要包含用户端、题库管理系统、后台管理系统三大部分。用户可以通过小程序在线刷题、查看答案解析、查看个人练习情况,而......
  • [CSP-J 2022] 乘方
    题面题目描述小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数aaa和b......
  • [CSP-J 2021] 分糖果
    题面题目背景红太阳幼儿园的小朋友们开始分糖果啦!题目描述红太阳幼儿园有nnn个小朋友,你是其中之一。保证n......
  • Day11 备战CCF-CSP练习
    Day11题目描述题目很长,就不赘述了(主要是懒得写)题目解析Gauss消元题目的提示很明显,将元素守恒作为建立等式的基础。只要满足每一行元素守恒,即\(x_1+x_2+···+x_n=0\)即可元素个数为\(m\),物质个数为\(n\),增广矩阵的大下为\(m*(n+1)\),Gauss消元时间复杂度为\(O......