51NOD
lajiyuan_
已经退役啦,会不定期更新cf博客 or 其他计算机知识相关的博客.
展开
-
~~~~每天睡前一道51nod四/五级题系列~~~~
2018/08/27/00:5251nod1391–01串 题意 求一段区间(i,j),保证区间内存在一个i<=x原创 2018-08-27 01:06:07 · 650 阅读 · 2 评论 -
【51NOD-1191-消灭兔子】优先队列+贪心
51NOD1191消灭兔子题意就是有n只生命值不同的兔子,有m支不同的箭就是有n只生命值不同的兔子,有m支不同的箭就是有n只生命值不同的兔子,有m支不同的箭每种箭有不同的伤害和花费,每个兔子只能被射一次,每支箭只能用一次每种箭有不同的伤害和花费,每个兔子只能被射一次,每支箭只能用一次每种箭有不同的伤害和花费,每个兔子只能被射一次,每支箭只能用一次求杀死所有兔子的最小花费。求杀死所有兔子的最...原创 2018-10-23 00:29:28 · 185 阅读 · 0 评论 -
【51NOD-1243-排船问题】 二分
51NOD1243排船问题题意一个码头中有N艘船和N个木桩,船的长度为2∗X,码头的宽度为M一个码头中有N艘船和N个木桩,船的长度为2*X,码头的宽度为M一个码头中有N艘船和N个木桩,船的长度为2∗X,码头的宽度为MN个木桩的位置(相对码头左岸的位置)会在数据中给出N个木桩的位置(相对码头左岸的位置)会在数据中给出N个木桩的位置(相对码头左岸的位置)会在数据中给出船和船之间不能重叠,即每艘...原创 2018-10-23 00:38:37 · 386 阅读 · 0 评论 -
【51NOD1686第k大区间】二分+尺取
51NOD1686第k大区间题意就是定义一个区间的值为这个区间众数的出现次数,给出n个数,将所有区间的值排序后求第k大的值是多少。首先这个结果是可以二分的,二分答案之后只需要验证区间的值大于当前mid的个数是不是大于等于k,而验证的方法就是尺取,因为这道题区间的值是众数出现次数,而如果某个区间满足,那么左端点不变,右端点向右移动的所有区间肯定都满足,所以满足尺取的条件,于是通过尺取O(n)验证,...原创 2018-11-21 16:15:52 · 152 阅读 · 0 评论 -
【51NOD1605棋盘问题】 奇偶博弈
51NOD1605棋盘问题上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的。亚当和夏娃在玩一个游戏,每次寻找边长为x的正方形,其中每个格子必须为黑色,然后将这些格子染白。如果谁不能操作了,那么那个人就输了。规定上x只能是1或者质数。做法就是看x的范围想到的,由于x一定为奇数,所以每次操作奇偶性都会改变,所以一上来如果亚当面对奇数,则最终一定赢,如果亚当一上来面对偶数,最终一定输...原创 2018-11-21 16:42:29 · 346 阅读 · 0 评论 -
【51NOD1287 加农炮】二分+预处理
51NOD1287加农炮题意就是给你n个山,每个山的高度为h[i],有m发炮弹,每发炮弹的高度为b[i],每次炮弹只能打中>=b[i]的第一座山脉,并使这座山的前一个删高度上升1,问m发炮弹之后每座山的高度做法这道题有一个想法如果想到了就很好做,就是后面的山比前面矮的话就是没用的,所以我们只要用另一个数组存一个单调递增的高度,如果后一个山小于前一个山的高度,就把他的高度改为前一个山的...原创 2018-11-22 01:14:46 · 154 阅读 · 0 评论 -
【51NOD1366贫富差距】 floyd
51NOD1366贫富差距题意就是给你n个人,如果某两个人是朋友,他们之间存款差距<=d,给定d和n个人的关系,求最富有的人和最贫穷的人的存款差最大为多少,其实就是求出最长路,最长路上所有权值设置为d,也就是最长路的大小len,答案就是len*d,如果图不连通,那么就输出-1代码#include<stdio.h>#include<iostream>#incl...原创 2018-11-20 00:38:35 · 206 阅读 · 0 评论 -
【51NOD1282时钟】 最小表示法
51NOD1282时钟题意就是给你n个时钟,你可以旋转表判但是指针不会跟着旋转,问任意次旋转后最多有多少个时钟完全相同做法就是考虑其实表盘在这里没什么用,只要所有指针的间隔相同,那么这两个时钟就相同,于是我们求出所有间隔,判断两个循环串是否有相同得时刻就用最小表示法,再用最小表示法表示一下,求最多出有多少个相同的最小表示法即可。代码#include<stdio.h>#in...原创 2018-12-01 23:17:11 · 186 阅读 · 0 评论 -
【51NOD1420数袋鼠好有趣】 sort+思维
题意给你n只袋鼠,一只小袋鼠能装进一只大袋鼠的条件是,大袋鼠的大小至少是小袋鼠的两倍。只大袋鼠最多可以装一只袋鼠。小袋鼠被装进大袋鼠之后就不能再装其它的袋鼠了。求一个最优方案,使得被看见的袋鼠最少。做法一定是先sort用小的装大的,但是用哪个去装呢一定是先sort用小的装大的,但是用哪个去装呢一定是先sort用小的装大的,但是用哪个去装呢我们sort之后把袋鼠分为两部分,前一半做小袋鼠,后...原创 2018-12-01 23:29:16 · 201 阅读 · 0 评论 -
【51NOD1055 最长等差数列】DP+剪枝+Hash
51NOD1055 最长等差数列题意就是给你n个数,让你用n个数组成一个最长的等差序列。1&lt;=n&lt;=1041&lt;=n&lt;=10^41<=n<=104做法我们肯定要想O(n2)O(n^2)O(n2)的做法再加一些剪枝,首先将数组排序,之后我们设dp[i][j]dp[i][j]dp[i][j]表示以i为结尾的公差为j的最长等差序...原创 2018-12-06 01:27:48 · 163 阅读 · 0 评论 -
【51NOD 1084矩阵取数问题】DP
51NOD1084 矩阵取数问题题意就是给你一个n*m的矩阵,从左上角走到右下角(只能向右向下走),再从右下角走到左上角(只能向左向上走),第一次来到一个格子会获得这个格子的权值,问最终回到左上角的获得的最大总权值.做法就是将两条路径看作都是从原点出发的,然后设置dp[i][j][k][l]为第一条路径走到(i,j),第二条路径走到(k,l)时的最大权值和,转移也很清晰,四种转移方式,如果...原创 2018-12-09 10:16:28 · 207 阅读 · 0 评论 -
【51NOD1489】 DFS
51NOD1489题意就是给你n个弓箭手,你需要将他们全部杀死,每次可以对某个弓箭手造成a点伤害并对其左右弓箭手造成b点伤害,不能攻击最左和最右侧的弓箭手,每个弓箭手有一定的生命值,求最少需要多少次攻击可以杀掉所有弓箭手。做法就是从左到右枚举每一个位置的攻击次数,对每个当前状态从右往左遍历,对每个完全杀死弓箭手的状态的攻击次数取min代码#include<stdio.h>#i...原创 2018-10-16 01:43:15 · 158 阅读 · 0 评论 -
【51NOD-1875-丢手绢】 约瑟夫环+暴力
51NOD1875丢手绢题意就是约瑟夫环问题,n个人每次向后传递k次然后这个人退出游戏,问最后一个人是谁。这道题给出n,一共2*n个人进行游戏,要求前n个退出游戏的人序号在n+1-2n之间,由于这道题n只有14,我们只要暴力算出14种情况即可,但是这里暴力的姿势需要优雅,我们用vector模拟环,用erase模拟退出游戏,然后暴力算就可以了。代码#include<stdio.h&g...原创 2018-10-08 21:53:27 · 211 阅读 · 0 评论 -
【51NOD1009数字1的数量】 数位DP
51NOD1009数字1的数量 题意就是求1-n之内出现过多少个1,比如11出现两次,112出现两次。 直接分为两种数位dp, 当当前位为1时,后面进行无限制数位dp求方案数, 当前位不为1时,直接数位dp下一位, 这样就算出了每一位为1对前一位的贡献。前一位不断加上后面可能的贡献数就好了。 代码#include&lt;iostream&gt;#include&lt;cstdio...原创 2018-09-17 02:24:16 · 210 阅读 · 0 评论 -
【51NOD1060最复杂的数】 DFS
51NOD1060最复杂的数 题意就是求1-n中约数个数最多的数,1<=n<=1e181<=n<=1e181n=2a1∗3a2∗5a3∗7a4∗.......n=2a1∗3a2∗5a3∗7a4∗.......n={2}^{a1}*{3}^{a2}*{5}^{a3}*{7}^{a4}*....... 我们发现当所有质数出现一次的时候,只需要15个质数就可以到达,1e17,...原创 2018-09-17 17:42:51 · 143 阅读 · 0 评论 -
【51NOD 1107 斜率小于0的连线数量】 离散化+权值线段树
51NOD1107斜率小于0的连线数量 题意就是二维平面上N个点之间共有C(n,2)条连线。求这C(n,2)条线中斜率小于0的线的数量 我们将两个点的坐标描述一下就是.A点为(ax,ay),B点为(bx,by)斜率小于0也就是bx&gt;ax且by&lt;ayA点为(ax,ay),B点为(bx,by)斜率小于0也就是bx&gt;ax且by&lt;ayA点为(ax,ay),B点为(bx,by)斜...原创 2018-09-13 08:30:13 · 112 阅读 · 0 评论 -
【51NOD1557两个集合】 SET
题目链接https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1557题意给你n个不同的数和两个空的集合和两个数A,B,如果你把x丢进a集合,那么一定也要把A-x丢进a集合,,如果你把x丢进b集合,那么一定也要把B-x丢进b集合,也就是说对于某个数如果A-x和B-x都不存在,那么游戏就结束了,如果某个元素x在a集合而A-...原创 2018-09-18 12:38:24 · 191 阅读 · 5 评论 -
【51NOD 1040 最大公约数之和】 GCD+欧拉函数
51nod1040最大公约数之和 题意 给出一个n,求1-n这n个数,同n的最大公约数的和。 做法 我们知道最后肯定是求n的每个因子所做的贡献, 考虑因子p的贡献是 gcd(n,x)=p(x&lt;=n)gcd(n,x)=p(x&lt;=n)gcd(n,x)=p(xgca(n/p,x/p)=1gca(n/p,x/p)=1gca(n/p,x/p)=1 于是这里x的出现次数就是在小于n/...原创 2018-09-11 02:44:32 · 217 阅读 · 0 评论 -
【51NOD 1391 01串】前缀和预处理
51nod1391–01串 题意 求一段区间(i,j),保证区间内存在一个i&lt;=x&lt;ji&lt;=x&lt;ji原创 2018-09-11 02:45:53 · 198 阅读 · 0 评论 -
【51NOD 1103 N的倍数】前缀和+鸽巢定理
51nod1103N的倍数 题意 就是一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数。 做法 首先肯定要先将所有数对n取个模数,然后想到加和的话,就往前缀和方向想一想,如果我们现在是%n意义下的前缀和,因为%n之后一共有n个取值0-n,如果这n个取值均不相同,那么我们就可以找到那个0的位置,0位置的前缀和%n就是0。如果n个取值中有两个相同,那么这两个位置之间的那段区间...原创 2018-09-11 02:46:45 · 134 阅读 · 0 评论 -
【51NOD1405树的距离之和】 树形DP
51NOD1405树的距离之和 题意就是给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和。 首先由于这里树上的距离都是1,所以祖先与子孙的距离就是深度之差,我们可以一次树形dp求出每个子树包含的点的个数,并统计每个节点的深度,这样所有点距离根节点的最短距离就是所有点的深度之和,之后我们想如何向下DPDPDP,假设父亲的答案为dp[y]dp[y]dp[y...原创 2018-09-14 01:54:25 · 221 阅读 · 0 评论 -
【51NOD1179最大公约数】 暴力枚举统计
51NOD1179最大的最大公约数 求给定n个数两两之间最大公约数的最大值,由于n只有5e4,我们可以(nsqrtn)枚举出所有数的所有因子,对所有出现次数大于两次的因子取max就可以了。(A了之后想了一下可以类似埃筛大概nlogn就可以做掉此题 nsqrtn代码390ms#include<stdio.h>#include<iostream>#include...原创 2018-09-14 02:20:22 · 179 阅读 · 0 评论 -
【51NOD-1108-1109距离之和最小V2V3】 排序,思维
51NOD1108距离之和最小V2题意就是给你三维平面上的n个点,找出一个点到所有点的曼哈顿距离之和最小。首先我们可以发现计算曼哈顿距离和时x,y,zx,y,zx,y,z是分开的,所以我们只要按照一维的方法去做,一维的方法怎么做呢,我们发现我们最终一定是找到某个数,最终的和就是这个数减去所有比他小的加上所有比他大的减去这个数,所以当这个数等于中位数的时候是最优的。代码#include<...原创 2018-10-08 21:46:51 · 204 阅读 · 0 评论 -
【51NOD1120 机器人走方格】卡特兰数+卢卡斯定理
51NOD1120 机器人走方格题意就是给你一个nn的方格,从左上到右下画一条线。一个机器人从左上走到右下,只能向右或向下走。并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?做法就是把它看成括号匹配问题,向下走看成左括号,向右走看成右括号,就变成了构造一个长度为2(n-1)的合法括号匹配序列,就是卡特兰数ans=C(2∗n−2,n−1)−C(2∗n−2,n−2)ans...原创 2018-12-09 10:28:26 · 236 阅读 · 0 评论