- 博客(15)
- 收藏
- 关注
原创 线段树练习- 你能回答这些问题吗?
题目链接题目来源:《算法竞赛进阶指南》题目难度:题目描述给定长度为NNN的序列AAA和MMM条指令,指令类型有两种:1 x y : 查询区间[x,y][x,y][x,y]的最大连续子序列和2 x y:修改A[x]A[x]A[x] 为yyy题目解析对于区间[x,y][x,y][x,y]最大连续子序列和有两种情况:左/右子问题的解跨左右子问题具体参考参考最大子序列和问题中的分治解法。因此...
2022-05-23 12:30:25
164
原创 [NOIP2018 普及组] 摆渡车题解
题目链接题意给出n名同学到达车站的时间,只有一辆摆渡车,来回需要mmm分钟,求将所有同学摆渡到终点,所有同学的最少等车时间之和。抽象一下题意:数轴:时间轴点权值:此时刻等车的人数区间右端点:发车时刻区间内每个点到区间右端点的加权距离和:等车时间和问题变成,将要数轴划分若干成左开右闭的区间,区间长度 ≥m\geq m≥m,每个区间的值定义为区间内每个点到区间右端点的加权距离和,求所有区间值和的最小值。根据题意,易得区间长度≥m\geq m≥m进一步分析,区间长度 <2m<
2021-09-25 17:40:27
920
原创 [NOIP2000 提高组] 方格取数题解 -多线程动态规划
题目题意给出一个N*N的数字方阵,从左上角走到右下角,每次只能向右或者向下走,走过的方格数字变为0。走两次,求两条路径的最大和。题目分析典型的动态规划题目。如果走一次,定义dp[i][j]dp[i][j]dp[i][j]为走到iii行jjj列的路径最大和,由于只能向右或者向下走,则转移方程为:dp[i][j]=max(dp[i−1][j],dp[i][j−1])+a[i][j]dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + a[i][j]dp[i][j]=max(
2021-09-06 21:32:54
257
原创 LCIS(最长公共上升子序列)
题目描述给定两个长度分别为n和m的序列A和B,求两个序列的最长公共上升子序列长度。例如:1 5 3 6 3 2 7 3 6 2 和 9 6 2 3 1 5 3 3 6 1 的最长上升子序列的长度为3。题目分析这是一道LIS和LCS的综合题目。【状态定义】:dp[i][j]dp[i][j]dp[i][j]表示序列A[1:i]A[1:i]A[1:i]和序列B[1:j]B[1:j]B[1:j]构成的以B[j][B[j][B[j][为结尾的LCIS长度。【状态转移】 为:A[i]≠B[j]A[i
2021-08-25 21:12:58
588
原创 P5662 [CSP-J2019] 纪念品题解
题目链接题意已知TTT天NNN种纪念品每天的价格,最初有MMM个金币,求经过N天的交易后,最多有多少个金币?每天可以交易无限次,每种物品可以买卖无限个,只要金币足够。每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。题目分析这是一个完全背包问题。由于每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币,因此不必考虑当天结束后,手里有多少金币和多少物品,统一用金币数量来衡量,那物品的价值价值由什么决定?答案是明天的价格。那么,
2021-08-21 19:16:44
281
原创 [NOIP2018提高组] 货币系统 题解
题目链接题目模型给出具有n个数字的集合,求最多能删除多少个数,使得删除后的集合和原集合等价,等价的定义为:对于任意非负整数,原集合能表示则新集合也能表示出。每个数字可以使用无数次。思路进一步分析,哪些数字是能删除的?如果这个数字能够通过原集合中的其它数字组合出,则这个数字可以删除。这其实是一个完全背包问题。将集合内的数字升序排序,推一遍完全背包,在推的过程中,判断a[i]是否能被前i个数组合出来。(组合方式是求和,且已升序排序,推到这里组合不出来,后面也不会组合出来了)。定义状态dp[i][
2021-08-20 15:51:16
123
原创 [NOIP2014 提高组] 飞扬的小鸟 题解
题目链接题意一个宽n高m的方格图,k组管道(图红色处),一只小鸟从左面任意高度起飞(包括0和m),高度为0或者碰到管道游戏结束。点击一次屏幕高度上升xix_ixi, 不点则下降yiy_iyi,可点击多次屏幕,效果累加。求飞到右边界(任意非0位置)的最少点击屏幕次数。题目分析这是一道01背包和完全背包的组合题。有两种情况:不点屏幕 — 01背包问题点击k下屏幕 ---- (必选物品的)完全背包问题【注意】:顶部位置需根据题意特殊处理。对于dp[i][m], 哪些状态会影响它?
2021-08-19 19:55:08
207
原创 [USACO2.2]集合 Subset Sums解析
题目链接题意给出 1∼n 的连续整数集合,求划分成两个和相等的子集合的方案数,如果不能划分,则输出0。题目分析【01背包问题】定义dp[i][j]状态为:前 i 个数字,和为 j 的方案数。状态转移:j < i (不能选第i个) :dp[i][j]...
2021-08-03 18:08:36
520
原创 [NOIP2006 提高组] 金明的预算方案解析
题目链接题意金明有n元钱,最多允许购买m件物品。物品分为两类:主件和附件。规定:每个主件有0、1或2个附件,每个附件只对应一个主件,附件没有自己的附件。给出每件物品的价格,重要度,和从属关系,求出所选物品的价格与重要度乘积最大值。题目分析这是一道有依赖的背包问题。仅考虑一个主件和它的附件集合,可选的策略最多有以下五种:不选仅选主件 — 物品1选主件+附件1 — 物品2选主件+附件2 — 物品3选主件+附件1+附加2 — 物品4问题转化成了分组背包,每组中最多有4种物品,组内的物
2021-07-30 21:16:17
126
原创 01背包、多重背包与完全背包
01背包空间优化为什么可以空间优化?因为dp[i][j]只受dp[i-1][j-c[i]]和dp[i-1][j]的影响,因此完全可以逆序求,直接覆盖到dp[i-1]这一行。不用担心覆盖掉dp[i-1][j]会有什么负面影响,因为dp[i-1][j]只能被用来更新dp[i][j] 和 dp[i][j+c[i]],而由于是逆序更新的,当它被覆盖时,这两个值已经被更新了,它已没有用了。这也是为什么要逆序更新,而不是顺序更新的原因。 for (int i = 1; i <= N; i++) {
2021-06-24 16:46:10
117
原创 C/C++详解floor()、ceil()和round()
1. floor()函数作用:返回不大于 x 的最大整数值。函数原型:double floor(doube x);返回值:double类型头文件:cmath#include <iostream>#include <cmath>using namespace std;int main(){ double a = 1.3, b = 1.7, c = -1.3,d = -1.7; cout<<floor(a)<<" "<&
2021-04-05 21:17:15
3214
原创 C++11 auto关键字
用途C++11新标准引入了auto类型说明符,使编译器替我们去分析表达式所属的类型。显然,auto定义的变量必须有初始值。用法编译器会根据表达式来确定类型int a = 3, b=4;auto c = a + b; //c的类型为int。int a = 3;double b = 4.5;auto c = a+b; //c的类型为double可以使用auto在一条语句中声明多个变量。但要注意:一条语句只能有一个基本数据类型,所以该语句中所有变量的初始基本类型必须一致。auto
2021-04-02 20:56:44
220
原创 C++ static类成员
为什么要使用static成员?当你的程序需要统计已经创建的特定类型对象的数量的时候,通常需要用到static成员,而不是全局对象。虽然两者均能实现其功能,但是相对于全局对象,static成员具有以下优点:static成员的名字在类的作用域钟,可避免与其它类的名字冲突。、可实现封装。static和普通类成员一样,可以为私有、共有或保护类型。static成员在使用时需要类名限定,可清晰地显示其关联性。static成员和普通类成员的主要区别普通数据成员存在于对象中,static数据成员独立于类
2021-03-30 22:21:51
206
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人