自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Ray.C.L的博客

TA很懒什么都没留下

  • 博客(63)
  • 收藏
  • 关注

原创 求俄罗斯套娃素数(BFS)

思路:首先他要是个素数,然后在素数的基础上扩展每一位去找#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>#include<map>#include<sta.

2020-08-31 22:11:30 311

原创 1019 数字黑洞

思路:转成字符串排序然后再转成数字做减法,坑点是输入要自己补前导0#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>#include<map>#include&..

2020-08-31 18:22:29 130

原创 乐团派对(dp)

思路:dp[i]表示前i 个乐手可以组成乐团的最大值,为了方便处理所以我们要先排序,我们可以发现如果i-a[i]>=0那么有2种选择一种是在i-a[i]+1处新建一队,或者是直接加入前i-1个人组成的队伍,dp[i]=max(dp[i-1],dp[i-a[i]]+1),如果i-a[i]<0那么说明第i个人必定落单,不能构成乐队此时dp[i]=0#include<bits/stdc++.h>using namespace std;const int N=1e5+5;int d.

2020-08-30 12:39:13 154

原创 逃跑路线

思路:我们可以发现&(2^1-1) & … (2^n)=1那么题目就转换成判断是奇数还是偶数那么我们只需要判断最后一位&是0还是1即可#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#inclu.

2020-08-29 18:44:51 307

原创 使徒来袭(二分)

思路:已知3个数的积,求3个数和的最小值,那么当3个数相等时和是最小的,二分答案即可。#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>#include<map>.

2020-08-29 10:08:40 376

原创 Dual Prime(线性筛+前缀和)

思路:这个题在预处理的时候先用线性筛求出1——1e6的素数,然后枚举(O(n^2))所有可能的x,用个桶求存储,然后对桶求个前缀和,最后对给出的区间进行O(1)的查询#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#i.

2020-08-28 18:43:33 612

原创 股票买卖V(状态机模型)

思路:多了一天的冻结期那么我们就多一个状态,dp[i][0]表示第i天手上持有股票,dp[i][1]表示第i天处于冻结期,dp[i][2]表示第i天处于卖出的天数>=2天的时间时的最大值。根据状态的表示我们看状态的来源和出口,第i天手上持有股票那么说明他可能是在第i天买的也有可能是在第i天之前就已经持有股票,那么dp[i][0]=max(dp[i-1][0],dp[i-1][2]-w[i])。如果第i天处于冻结期那么他只能是在第i天吧股票卖出去所以dp[i][1]=dp[i-1][1]+w[i]..

2020-08-28 12:23:37 402

原创 股票买卖IV(状态机模型)

思路:只能持有一个股票所以要么卖出要么买入,最多交易k次,那么我们就用dp[i][j][0/1]表示前i天交易j次当前没有/有股票的最大利润。如果第i天交易j次时手上没有股票那么就有2种可能1.在前i-1天已经交易了j次没有股票了2.在前i-1天是持有第j次交易的股票,然后在第i天吧股票的卖掉了dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]+a[i])当第i天持有股票时也是2种状态1.在前i-1天的时候已经持有了股票2.在前i-1天的时候不持有股票然后在.

2020-08-27 16:56:25 573

原创 金明的预算方案(dp+二进制枚举)

思路:对于每个附件我们必须要搭配主键,当他最多有2个附件时,我吗的选法是4种:1.主键。2.主键+附件1。3.主键+附件2。4.主键+附件1+附件2。对于每个附件我们是选择选和不选所以是2n2^n2n种组合,这四种选法当中我们只能选一个,所以我们可以把它看成一个分组背包。用二进制枚举看第i位是否为1就表示要不要选第i个附件。#include <cstdio>#include <cstring>#include <algorithm>#include <...

2020-08-27 13:12:41 185

原创 能量石(dp+贪心)

思路:我们假设最优解的选择是a1,a2…an,对于任意的2个石头我调换吃的顺序假设调换后贡献增大对应i,j位置i<j,假设之前的总耗时是t可以发现Ei−t∗Li+Ej−(t+Si)∗Lj>Ei+Ej−t∗Lj−(t+Sj)∗LiEi-t*Li+Ej-(t+Si)*Lj>Ei+Ej-t*Lj-(t+Sj)*LiEi−t∗Li+Ej−(t+Si)∗Lj>Ei+Ej−t∗Lj−(t+Sj)∗Li化简后得Si∗Lj<=Sj∗LiSi*Lj<=Sj*LiSi∗Lj<=...

2020-08-26 12:47:57 450 1

原创 背包问题求具体方案

思路:要求字典序最小的解法,原来的dp方程求方案的解法只能从大的到小,现在要从小大来求那么我们就变一下dp方程,原来呢我们是用dp[i][j]表示前i 物品中选体积不大于j的最大价值,现在吧dp[i][j]改成从i开始的所有物品中选体积不大于j的最大价值。那么转移方程就是dp[i][j]=max(dp[i+1][j],dp[i+1][j-v[i]]+w[i])。两种选法,第一种不选i那就是前i+1件物品选出体积不大于j 的,第二种选i就是前i+1件物品选出体积不大于j-v[i]的。要求具体方案就反向思考..

2020-08-25 19:18:32 204

原创 背包问题求方案数

思路:我们先按普通背包求出最大价值是多少,然后f[i][j]就表情前i个物品中体积恰好为j时的最佳方案数,f[i][j]=f[i-1][j]+f[i-1][j-vi],f[0]初始化为1.#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<qu..

2020-08-25 16:38:20 227

原创 分组背包

思路:dp[i][j]表示前i组背包选出体积不大于j的最大价值,dp[i][j]=max(dp[i][j],dp[i-1][j-v[i][k]]+w[i][k]),dp[i][j]初始化为i不选的情况dp[i][j]=dp[i-1][j],然后枚举这一组背包中k个物品的选法。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostre..

2020-08-25 12:02:07 174

原创 树上背包

思路:dp[i][j]表示以i为根节点选出体积不超过j的最大价值。因为根节点必选所以我们吧dp[i][v[i]~m]全部置为w[i],对于每个节点如何选他的子节点就是在他所有的子节点中选一个,那么我们就可以吧他看成一个分组背包。体积的决策空间在j=m——v[i]之间因为小于v[i]根节点就不能选了,他的子节点就是在0——j-v[i]。#include <cstdio>#include <cstring>#include <algorithm>#include...

2020-08-25 11:41:28 181

原创 开心的金明(01背包变形)

思路:根据题意我们可以吧物品总价格视为背包体积,每个物品的价格视为所占用的体积,背包价格乘以优先级是价值,dp[i][j]表示前i个物品中体积不大于j的最大价值,dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+val) 此时val=v*p#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>..

2020-08-25 10:08:58 128

原创 机器分配(分组背包变形)

思路:从题意中我们可以发现,我们可以吧N看为背包组数,M看为背包体积和每组背包的组内个数,矩阵内每个值可以看为i组背包选j个物品的价值,那么这就是个分组背包了,dp[i][j]表示从前i组选出体积小于等于j的最大价值,dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i][k]]+val[i][k])因为这里的v[i][k]是0——m所以直接用k代替。dp[i][j]=max(dp[i-1][j],dp[i-1][j-k]+val[i][k]),然后是求方案,我们枚举可行的方案也就..

2020-08-24 17:42:47 240

原创 潜水员(二维费用背包变形)

思路:根据题意我们吧氧气和氮气含量看做背包的体积和重量,氧气管重量看成价值,那么可得dp[i][j][k]就表示前i 个物品中氧气含量至少为j,氮气含量至少为k的最小重量。dp[i][j][k]=min(dp[i-1][j][k],dp[i-1][j-v[i]][k-w[i]]+val[i])这里的状态当j,k的值可以取负数已经符合题意,所以当j,k为负数的时候我们吧他置为0。#include <cstdio>#include <cstring>#include <...

2020-08-24 12:16:00 178

原创 二维费用背包问题

思路:dp[i][j][k]表示前i个物品中选出体积小于等于j重量小于等于k的最大价值,01背包拓展一维dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-v[i]][k-w[i]]+val[i]),优化第一维#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<..

2020-08-24 11:10:35 353

原创 混合背包问题(dp)

思路:不同情况用不同的背包dp,数据范围较大所以多重背包时要用二进制优化。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>#include<stack>#include<bits/stdc++.h&g..

2020-08-24 10:52:39 272

原创 庆功会(多重背包)

思路:dp[i][j]表示从前i件奖品中选出价格小于等于j的最大价值,dp[i][j]=max(dp[i-1][j],dp[i-1][j-kv]+kw)通过滚动数组优化第一维。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue&gt..

2020-08-23 12:47:11 431

原创 NOIP2018提高组 货币系统(完全背包变形 )

思路:我们可以发现三个性质:1.a1,a2…,an一定可以被表示出来2.b1,b2,…bm一定是从a中选出来的3.bi不能被其他b中的数表示出来很明显a肯定是大数被小数表示出来,所以我们对a排序,然后我们判断每个数能不能被前面的数表示出来,此时状态已经确定了,如果一个数可以被表示那么我们就不需要这个数,如果这个数在之前没有被表示出来,那么我们必须选。能不能判断ai能不能被表示出来就是判断能不能从a1——ai-1组成恰好值为ai的背包。#include <cstdio>#inclu..

2020-08-21 12:08:03 254

原创 买书(完全背包变形)

思路:从最大价值改成求方案数,dp[i][j]表示从前i个书找到恰好j元的方案数,dp[0][0]=1,dp[i][j]=∑dp[i−1][j−k∗v[i]]dp[i][j]=\sum dp[i-1][j-k*v[i]]dp[i][j]=∑dp[i−1][j−k∗v[i]] for(int i=1;i<=4;i++) { for(int j=0;j<=n;j++) { for(int k=0;k*a[i]<=j;k+.

2020-08-20 20:47:38 181

原创 数字组合(背包变形)

思路:我们可以吧a[i]没个元素的值当价值,m当做背包容量,让dp[i][j]表示为从前i个数字从选出恰好为j个方案数,这里就有两种选法,1.i不选那就是dp[i][j]=dp[i-1][j],2.是选择i那就是dp[i][j]=dp[i-1][j-a[i]]。可得转移方程dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]]因为dp[i][j]表示的是恰好为j的方案个数所以dp[0][0]=1#include <cstdio>#include <cstring&gt.

2020-08-20 16:28:03 188

原创 宠物小精灵之收服(二维费用背包问题)

思路:多了一维我们加一位dp[i][j][k]表示前i个小精灵当中我们用了个不超过j个精灵球时皮卡丘使用了不超过k体力时能捕获最多 的精灵个数,dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-a[i]][k-b[i]]+1)我们用滚动数组去掉第一维。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<io...

2020-08-20 14:44:21 189

原创 装箱问题(背包dp)

思路:dp[i][j]表示从前i个物品中选出总重量不超过j的最大值是多少。当j<w[i]时什么也不能选dp[i][j]=dp[i-1][j],否则dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i])#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include&l..

2020-08-20 11:45:42 295

原创 最长公共上升子序列(dp)

思路出处思路:状态表示:dp[i][j]代表a从1——i和b从1 —— j中以b[j]结尾的公共上升子序列的集合; dp[i][j]的值等于该集合的子序列中长度的最大值。首先依据公共子序列中是否包含a[i],将dp[i][j]所代表的集合划分成两个不重不漏的子集: 不包含a[i]的子集,最大值是dp[i - 1[[j]; 包含a[i]的子集,将这个子集继续划分,依据是子序列的倒数第二个元素在b中是哪个数: 子序列只包含b[j]一个数,长度是1; 子序列的倒数第二个数是b[1]的集合..

2020-08-19 22:55:03 555

原创 导弹防御系统(dfs贪心)

思路:题目要我们求用多少个上升序列和下降序列打完所有的导弹,dfs找需要多少个上升和下降序列,up记录为上升序列的数量,down记录下降序列的数量,以pos为结尾看能接到那个下降或者上升序列中,如果不能就让up或者down加一#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector..

2020-08-19 14:57:14 353

原创 友好超市(dp,LIS)

思路:为了使得桥梁不相交,我们所选南方所对应的北方一定构成一个上升的序列,我们要按坐标去选,所以要先排序。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>#include<stack>//#include&..

2020-08-18 18:31:37 159

原创 选课(树形dp)

思路:建立一个超级源点0,让内些不用学习前置课程的点作为0的子节点,用dp[i][j]表示以i为根节点选了j门课程的最大值,枚举以i为根节点,v为子节点的各种课程的分配办法,可得dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[v][k]),如果i不是源点,那么每次点亮一个新技能都需要点亮自己这一个,那么dp[i][j]=dp[i][j-1]+val[i]#include <cstdio>#include <cstring>#include <a..

2020-08-18 16:33:17 362

原创 传纸条(dp)

思路:一个从左上到右下只能向下或者向右走,一个从右下到左上只能向上或向左走,不能经过相同的点,我们吧从右下到左上的倒过来看就是一个从左上到右下只能向下或者向右走,那么我们就认为2个人同时从1,1出发到n,m不能经过相同点的最大值。数字三角形模型拓展以下我们用dp[i1][j1][i2][j2]表示两个路径从(1,1)点出发到(i1,j1),(i2,j2)。我们可以发现是同时出发所以i1+j1= i2+j2 所以我们可以压缩一维令 k=i1+j1,那么就变成了dp[k][i1][i2]此时我们令x=dp..

2020-08-18 10:33:51 269

原创 方格取数(dp)

思路:数字三角形模型拓展以下我们用dp[i1][j1][i2][j2]表示两个路径从(1,1)点出发到(i1,j1),(i2,j2)。我们可以发现是同时出发所以i1+j1= i2+j2 所以我们可以压缩一维令 k=i1+j1,那么就变成了dp[k][i1][i2]此时我们令x=dp[k][i1][i2],同时走有四个状态:1.a向下b向下 x=max(x,dp[k−1][i1][i2]+w)x=max(x,dp[k-1][i1][i2]+w)x=max(x,dp[k−1][i1][i2]+w)...

2020-08-17 19:44:45 237

原创 黑白树(树形dp)

思路:从子节点染色然到父节点,我们看每个节点的覆盖长度还有他子节点的覆盖长度,如果他的覆盖长度dep[u]>dp[v]-1他子节点的覆盖长度那么我们就去用大的更新dep[u]=max(dep[u],dep[v]-1)然后我们记录一下当覆盖距离为0时,他就只能靠自己去覆盖#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostre..

2020-08-17 17:11:55 626

原创 旅游(树形dp最大独立集)

思路:问能住几个晚上,每个晚上住的地方都是不相邻的,最大独立集问题。dp[i][0/1]表示以i为根节点并且不选/选这个点的最大值。如题i节点如果选了那么下个节点必定不能选dp[i][1]+=dp[v][0]dp[i][1]+=dp[v][0]dp[i][1]+=dp[v][0]如果i不选那么子节点可选可不选dp[i][0]+=min(dp[v][1],dp[v][0])dp[i][0]+=min(dp[v][1],dp[v][0])dp[i][0]+=min(dp[v][1],dp[v][0])#i..

2020-08-17 12:49:53 164

原创 最低通行费(dp)

思路:我们可以发现给定步数是2n-1那么说明不能走回头路,那就说明只能往下或者往右走那这就是个数字三角形模型的dp,我们用dp[i][j]表示前往i行j列的最小花费,前往i行j列有2条路,1是从上面。2是从左边过来,那么可得dp[i][j]=min(dp[i−1][j],dp[i][j−1])+val[i][j]dp[i][j]=min(dp[i-1][j],dp[i][j-1])+val[i][j]dp[i][j]=min(dp[i−1][j],dp[i][j−1])+val[i][j]此时我们发现第..

2020-08-16 19:51:51 686

原创 Corn Fields POJ - 3254 (状压dp)

思路:一行有m列那么每一列就有2m2^m2m个状态,我们先列出这些状态中可行的状态有多少,又因为有些地方我们不能放,所以在检测状态正确性时,需要记录当前行那些地方能不能放的状态,那么在输入时,如果为0那么我们吧这个当前行的这一列置为1,在后面与每一行的可行状态检测时进行&运算如果为0那么说明当前状态合法。每一行的状态都有上一行得来,方案数也是一样,dp[i][j]表示前i行中第i行的状态是j的时候的方案数。那么dp[i][j]=∑dp[i−1][k]+dp[i][j]dp[i][j]=\sum ..

2020-08-15 17:41:03 171

原创 费解的开关(二进制枚举)

思路:我们通过确定第一行的状态,来推出后面每一行的状态,第一行的状态有252^525个,那么我们枚举第一行的状态,看每一位是不是1然后按下第一行的开关,确定第一行的状态后,我们看从1——4行每个为0的位置依次按下控制这个位置的开关(他的正下方),最后看是否能全部变成1,。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostrea...

2020-08-14 18:55:22 176

原创 Caocao‘s Bridges HDU - 4738(求割边)

思路:题目就是求有没有桥让我们吧他拆了变成不连通,那么就有3种特殊情况,第一种是本身图就不连通我们就不用派人了,答案是0,第二种情况是这个桥0人看守,那么我们还是要派一个人去炸桥,毕竟桥自己不会爆炸,第三种情况是没有割边让我们炸答案就是-1,这里还有处理一下重边比如给你这么个图。如果不处理重边答案可能是2或者0(看先后顺序),但其实答案是-1,所以要处理下重边,一点出现重边那说明这2个点之间必定没有割边。#include <cstdio>#include <cstring>..

2020-08-14 11:16:26 181

原创 HDU-Fluctuation Limit(区间问题)

题目链接题意:给你n个价格范围l,r,问最后没组价格的上下浮动能不能不超过k思路:要让价格不超过k,设i的价格范围为L,R那么不超过k那么i+1的价格范围就在L-k,R+k这个范围内,为了时他们尽可能的波动小,L[i+1]=max(L[i+1],L[i]-k) R[i+1]=min(R[i+1],R[i]+k),从前往后,从后往前跑2遍,剩下的就是在价格波动k的范围内所有可选的值,我们看有没有L>R,若有则不成立,没有那么打印L——R区间的任意一个数#include <cstdio>

2020-08-13 18:53:35 334

原创 HDU-Clockwise or Counterclockwise

题意:给出3个点左边判断,按ABC的方向走判断是顺时针还是逆时针。矢量叉积:计算矢量叉积是与直线和线段相关算法的核心部分。设矢量P = ( x1, y1 ),Q = ( x2, y2),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1y2 -x2y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q)。一般在不加说明的情况下,本文下述算法中所有的点都看作矢量,两点

2020-08-13 17:41:19 212

原创 Codeforces Round #664 (Div. 2) C. Boboniu and Bit Operations (思维)

题目链接思路:答案所处范围是[0——(1<<9)]枚举答案,检测其正确性,|运算只能使一个数变大或者不变,最小就是不变的情况,(a[i]&a[j])|ans==ans对于每个a[i]都成立那么说明ans可行#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector&

2020-08-13 11:59:37 175

安卓studio最新版 android-studio-2021.3.1.16-windows.exe

安卓studio最新版 android-studio-2021.3.1.16-windows.exe

2022-09-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除