
算法
阿言在学习
这个作者很懒,什么都没留下…
展开
-
L2-030 冰岛人 (25分)
这个题有一点是挺恶心人的,下面给出:普通的维京人是要么sson要么sdottir,但是祖宗维京人就不是了,祖宗应该是m,并且祖宗的姓,去掉m之后并不是一个人的名字,就是一个单纯的姓而已,这里搞明白,你就懂了!L2-030冰岛人(25分)2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名。好事者发现冰岛人的名字后面似乎都有个“松”(son),于是有网友科普如下:冰岛人沿用的是维京人古老的父系姓制,孩子的姓等于父亲的名加后缀,如果是儿子就加 sson,女儿则加 sdottir。..原创 2020-11-27 21:26:53 · 505 阅读 · 0 评论 -
Acwing - 最长公共子序列
状态表示挺少见的:f[i][j]表示a[1 - i]与 b[1 - j]的公共子序列的最大长度。状态转移:化整为零,四种情况。(1)a[i]与 b[j]都不选就是f[i - 1][j - 1](2)a[i]与b[j]选其中一个就是f[i - 1][j]和 f[i][j - 1](3)a[i]与 b[j]都选 f[i - 1][j - 1] + 1状态转移方程:四种情况取最大即可枚举顺序:随便答案:f[n][m]897. 最长公共子序列 题...原创 2020-11-13 21:17:41 · 257 阅读 · 0 评论 -
背包问题细节整理
完全背包推导过程:多重背包:很简单的一个思想是将物品按数量打包成一个大的物品,照01背包来做,但是存在一个问题是这样打包会增重物品数量,我们这里采用二进制优化物品打包。这里记住一个例子,s = 200an ={1,2,4,8,16,32,64,73},an的任何一个子集的内部和就是200以内的所有数。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream&..原创 2020-11-12 11:32:35 · 183 阅读 · 0 评论 -
1047 糖果 01背包扩展
1047. 糖果 题目 提交记录 讨论 题解 视频讲解由于在维护世界和平的事务中做出巨大贡献,Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券。在这一天,Dzx可以从糖果公司的NN件产品中任意选择若干件带回家享用。糖果公司的NN件产品每件都包含数量不同的糖果。Dzx希望他选择的产品包含的糖果总数是KK的整数倍,这样他才能平均地将糖果分给帮助他维护世界和平的伙伴们。当然,在满足这一条件的基础上,糖果总数越多越好。D...原创 2020-11-09 16:54:37 · 184 阅读 · 0 评论 -
蓝桥杯包子凑数-完全背包
https://www.acwing.com/problem/content/1228/小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有NN种蒸笼,其中第ii种蒸笼恰好能放AiAi个包子。每种蒸笼都有非常多笼,可以认为是无限笼。每当有顾客想买XX个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有XX个包子。比如一共有33种蒸笼,分别能放3、43、4和55个包子。当顾客想买1111个包子时,大叔就会选22笼3...原创 2020-11-09 15:26:12 · 189 阅读 · 0 评论 -
2020.10 小米赛第一场 A题
先搞清楚几点:1.题目中没有说ai是互不相同的,所以可能有多个ai;2.题目中的目标序列是说,在目标序列中,任意两个元素都有倍数关系,即约数关系,让我们求序列的最大长度,很明显的感觉是个dp问题(这个坑我们以后再填)(1)状态定义:我们很容易想到的是对于原序列的每一个数,都去更新他倍关系的数量,比如2就可以去4的数量,我们认为2和4可以构成一段目标序列,那么dp[4]就是2 问题:上述思路其实是存在一定问题的,就比如2是6的约数,3是6的约数,但是2和3并不是约数关系,那么,6就需要选...原创 2020-10-28 15:20:08 · 250 阅读 · 0 评论 -
手写建堆
有个地方需要明确一下,堆是一棵完全二叉树,也就是n个结点的堆,正好可以占满长度为n的数组,进一步来说就是严格遵守k / 2 是 k的父亲结点,那么我们在建堆的过程中,我们认为第k个加入的点都应该在第k个位置,那么再 k/2 一层一层的比较,如果不满足最小堆或者最大堆定义,就直接交换即可,保持 k > 1 合法数据!7-6 关于堆的判断 (25分)将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:x is the root:x是根结点;x an原创 2020-10-20 20:50:16 · 186 阅读 · 0 评论 -
卡特兰数-两个经典做法
卡特兰数现在我能接触到的用处就是用于解决一个序列中,任意前缀和中1的数量不少于0的数量(在这个序列中,1与0的个数相等)证明如下图:卡特兰数 =(公式一) C(2* n , n) - C(2n , n- 1) = (公式二)C(2n , n) / (n + 1)组合数的板子很多,我们这里简单说3个吧模板一 :组合数求余大质数求C(a,b)时间复杂度: O(a * loga)#include<cstdio>#include<cstring>#include<io原创 2020-10-15 15:57:36 · 279 阅读 · 0 评论 -
Acwing 1243 糖果 - IDA*估值函数
1243. 糖果糖果店的老板一共有 M 种口味的糖果出售。为了方便描述,我们将 M 种口味编号 1∼M。小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而是 K 颗一包整包出售。幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。输入格式第一行包含三个整数 N,M,K。接下来 N 行每行 K 这整数 T1,T2,⋅⋅⋅,TK,代表一包糖果的口味。输出格式一个整数表示答原创 2020-10-10 13:51:00 · 511 阅读 · 0 评论 -
辗转相减法的发展应用-最大比例
这个题用到了辗转相减法的一个特殊应用简单分析一下如下1223. 最大比例X星球的某个大奖赛设了 M 级奖励。每个级别的奖金是一个正整数。并且,相邻的两个级别间的比例是个固定值。也就是说:所有级别的奖金数构成了一个等比数列。比如:16,24,36,54,其等比值为:3/2。现在,我们随机调查了一些获奖者的奖金数。请你据此推算可能的最大的等比值。输入格式第一行为数字 N ,表示接下的一行包含 N 个正整数。第二行 N 个正整数 Xi,用空格分开,每个整数表示调查到的某人的奖金数额。输出原创 2020-10-08 15:58:54 · 229 阅读 · 0 评论 -
acWing 1296 聪明的燕姿
用到了算数基本定理的思想,欧拉筛的不记录最小质因子的板子,另外在优化dfs的时候还用到了小学生求素数的一点小思想,下面我们简单说一下思路和分析几个问题。思路:正约数之和等于s的数,容易想到直接枚举每一个质数与每一个质数的数量,然后进行优化。第一个问题:欧拉筛存质数的数组到底开多大?这个问题,谁一开始写这个代码也不知道,除非花了很多时间分析,所以我们先保留这个问题。第二个问题:如何优化枚举。(1)先枚举数量还是先枚举质数?答:先枚举质数比较好,因为我们可以让下一次dfs调用,枚举素数开始的位置为上原创 2020-10-06 14:43:01 · 185 阅读 · 0 评论 -
算数基本定理 + 例题
算数基本定理即质因子分解定理,顾名思义,将一个数的所有质因子,及每个质因子的数量分解出来。(算数基本定理是数论的一个公理)在代码的实现的时候不能直接暴力,太慢,一般配合欧拉筛,这里欧拉筛的作用不是素数打表,而是求所有小于N的自然数的最小质因子,及minp。及对任意一个x都让他除尽minp[x],到x % minp[x] 不为0为止,之后再让新的x 除尽 新的minp[x],x为1为止。看道板子题1295. X的因子链输入正整数 X,求 X 的大于 1 的因子组成的满足任意前一项都能整除后一项的严格递原创 2020-10-05 20:55:52 · 642 阅读 · 0 评论 -
扩展欧几里德+例题
1299. 五指山大圣在佛祖的手掌中。我们假设佛祖的手掌是一个圆圈,圆圈的长为 n,逆时针记为:0,1,2,…,n−1,而大圣每次飞的距离为 d。现在大圣所在的位置记为 x,而大圣想去的地方在 y。要你告诉大圣至少要飞多少次才能到达目的地。注意:孙悟空的筋斗云只沿着逆时针方向翻。输入格式有多组测试数据。第一行是一个正整数 T,表示测试数据的组数;每组测试数据包括一行,四个非负整数,分别为如来手掌圆圈的长度 n,筋斗所能飞的距离 d,大圣的初始位置 x 和大圣想去的地方 y。输出格式对于原创 2020-10-05 20:01:46 · 521 阅读 · 0 评论 -
灵能传输-贪心
这个题是有难度的,思维性很高思路:根据题意,每次灵能交换的变化是:ai -= 2 * ai , ai-1 += ai , ai+1 += ai; 对于a的前缀和s来说,相当于是si-1 + ai, si - ai,si+1不变,那么我们其实容易看出,si-1 + ai = si; si - ai = si-1,那么其实也就是每次灵能传输其实就是前缀和数组相邻两项的交换,但是有两项是不能动的,首先是sn不能动,这个是很明显的,但是s0(我们这里a是从1开始的)不能动我们是需要解释一下的,s0 = 0,题目让原创 2020-09-27 21:38:45 · 597 阅读 · 0 评论 -
雷达设备-区间贪心
1.题意转换:每一个小岛的y作为直角边,雷达探测范围为斜边,勾股定理得第二条直角边的长度,将每个小岛在x轴的直角边算出,形成一个小岛区间集合,将小岛按右端点大小排序,我们初始时拿第一个区间的右端点作为index,遍历其余区间,如果下一个区间的左端点比index还要大,就要把index换成这个区间的右端点,并且雷达数目需要加一,因为无论放在哪里,1个雷达都是不可能覆盖这两个小岛的2.贪心问题,多做题多积累。雷达设备假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧。每个小岛都位于原创 2020-09-26 15:30:51 · 210 阅读 · 0 评论 -
货仓选址-贪心
贪心问题,一般就是一个思维题,那么下面这个问题用到一个小小的知识,在数轴上有n个点,在数轴找一点x,使得所有点到x点距离之和最小结论:当n为奇数时,x为数轴上点的中值点 当n为偶数时,x为数轴上点的两个中值点中间区域的任何一个点 证明:当n为奇数时,x选取中值点右边任何一个点,距离中值点距离为len,设每一个点到中值点的距离为ai,那么中值点左边的点a1+len,a2+len,a3+len ... a[n / 2]+len,同理,中值点右边的值都会ai-x,但是中值点会0 + len,故原创 2020-09-23 21:25:44 · 425 阅读 · 0 评论 -
数组模拟单链表
数组模拟单链表一般有两个数组,e[i]代表第i个输入的数的值,ne[i]代表第i个输入的数在链表结构上下一个节点是什么。这里需要明确一个地方,e[index]存储每一个数,index只是加,不会减,我们删除链表上的节点,只是对节点的ne进行改变,并不会把操作数的位置删除或者改变,就算删除了,那一项也依然在数组里。...原创 2020-09-22 19:46:51 · 148 阅读 · 0 评论 -
双指针-维护不变区域
第一次用双指针,在下面这个题中是在维护一个时间段,让这个时间段的长度永远不超过d,原理就是将时间段的两个左右两个端点设置为j与i,那么每次右端点增大,我们都判断,是否ij大于了d,如果ij大于了d,我们就让左端点往右移,实质上是在维护一段区间的长度。小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有N行。其中每一行的格式是:ts id 表示在tsts时刻编号id的帖子收到一个”赞”。现在小明想统计有哪些帖子曾经是”热帖”。如果一个帖子曾在任意一个长度...原创 2020-09-21 09:40:43 · 204 阅读 · 0 评论 -
前缀和(树状数组)构造桶数组的用法
咱们主要看两个题 第一题数星星,大概意思就是一颗星星的左下方有几颗星星,这个星星就是几级,但是输入是特殊输入,输入是按y的升序,如果y一样按x的升序来进行输入,最会输出0-n-1级的星星各有几颗。 因为后面的星星的高度一定大于等于前面的星星,所以就可以做一个实时的算法,也就是每输入一个星星就确定他的等级,因为之后的星星两种情况:1.在它的上面,不算入等级。2.与它同等高度,但x一定比它大,故也不算入等级。 那么如何确定等级呢?其实我们现在的问题在于,当前这颗星星的高度一定大于等于前...原创 2020-09-19 20:50:53 · 552 阅读 · 0 评论 -
差分矩阵呜呜呜
void insert(int x1,int y1, int x2,int y2,int c){ b[x1][y1] += c; b[x1][y2+1] -= c; b[x2+1][y1] -= c; b[x2 + 1][ y2 + 1] += c;} 我们构造差分矩阵的时候,可以认为原矩阵为0矩阵,然后我们动态改变这个矩阵一个区域的元素,当然这个区域在构造的时候只是一个点,即insert(i,j,i,j,a[i][j]);...原创 2020-09-19 14:33:16 · 251 阅读 · 0 评论 -
线段树与树状数组
1.线段树 线段树相对于树状数组较为灵活,但比树状数组的速度会稍微慢一点,且空间是四倍的树状数组。线段树的思想是,每个结点都是一个结构体{l,r,sum},表示l到r区间内的总和,灵活就灵活在这个总和,因为也可是这个区间最小值,最大值等,线段树一般有四个函数如下:void pushup(int u){ tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;}int build(int u,int l,int r).原创 2020-09-11 20:56:52 · 511 阅读 · 0 评论 -
PTA甲级15进制转换
一.十进制向N进制转换设进制数为X,Xwhile 除以N,直至X为0二.N进制向十进制转换从第零位依次乘N的位数次方即可三.数的翻转我们一般借助的是队列,先进先出,首位先进,首位先出进行处理#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;int n,.原创 2020-08-29 16:21:17 · 232 阅读 · 0 评论 -
二分模板 from y总
二分是一个看似很简单的搜索算法,但也是有讲究的,所以在这里,我整理一下模板这个模板有几个易错点,我们挨个看看:(1)l = mid +1, r = mid -1习惯性的错过mid错的原因很简单,就是因为你每(l+r)/2一次,你就少了一个mid,因为你这样写,无论如何取不到mid,所以有些情况你就会错过最优解。(2)mid = (l + r + 1) / 2与mid = (l + r) / 2这样写是为了避免死循环我们看模板1,如果mid = (l + r) / 2...原创 2020-08-26 15:05:33 · 479 阅读 · 0 评论 -
PTA甲级04
1004Counting Leaves(30分)A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.Input Specification:Each input file contains one test case. Each case starts with a line containing0<...原创 2020-08-19 16:55:56 · 203 阅读 · 0 评论 -
PTA甲级03
1003Emergency(25分)As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between any pai..原创 2020-08-19 16:50:19 · 139 阅读 · 0 评论 -
哈希值之逆序数与变进制
本贴针对的对象是每一项都互不相同的字符串而言,利用本文提到的逆序数与变进制可以实现哈希值与该特定字符串的唯一键值对应。 逆序数,即132, 2的逆序数为1 变进制,第i位的权值为value(i)*i! 哈希值 =从第一位到第n位,逆序数(i) * i!之和...原创 2020-07-28 16:44:48 · 380 阅读 · 1 评论 -
C++,next_permutation(start_array_index,end_index)的使用
1.permutation是排列的意思,next_permutation()就是下一个全排列序列的意思。2.next_permutation()的参数为数组指针的开端与结尾,也可以是vector,vector的begin()与end()也是指针。3.next_permutation()的返回值为bool,意为是否还存在下一个全排列序列,方法逻辑为改变数组排列。...原创 2020-07-25 21:20:00 · 219 阅读 · 0 评论 -
蓝桥杯-明码 bitset初识
题目解析: 16*16的矩阵,一个字节存8位信息,一个整数代表一个字节,一个字节存8位二进制,两个字节为一行,32个整数构成16*16的一个汉字,我们看到,其实最难的就是如何把整数快速的转化为二进制数,这里推荐一个#include<bitset>下的bitset<>类对整数进行快速转化。bitset详解: bitset<len>我们可以看成是一个数组,表示一个len位的二进制数,bitset<8> t; t = 5; t就表示5的8位二进制形...原创 2020-07-24 23:44:00 · 186 阅读 · 0 评论 -
论BFS与DFS
搜索题其实做了很长时间了,算法是一直没啥问题的,在学了树之后,理解还算到位。只不过今天在做九宫重排的时候一直想用DFS做,后来发现其实是很慢的,在这里再次对搜索算法进行概括性总结。 蓝桥杯中,搜索是必考的!(曹莫言把话放这,不考你来找我) 必考,但是只是中等题,就像高考中的立体几何题目,虽然简单,但是你必须做对,而且一分不能少,因为其他同学百分之八十都一定会做,如果你拿不到满分,那么你离省二也就越来越近了...... 话不多说,开唠! DFS一句话,一条路走到黑,而BFS不同,他...原创 2020-07-11 23:21:51 · 195 阅读 · 2 评论 -
L3_12水果忍者
这个题是一个思维题首先看需求,找一个直线,能够成功割到所有垂直的直线,并输出这条直线上的任意两个整数点所以我们应该先去找直线,然后再自己确定一个小规则,找到固定的点这里我们选择了(a[i].x,a[i].miny)作为最开始的点,也就是从一个选中的水果上的最下面的点去枚举其余直线,来确定answerline的斜率,对于两个直线来说最大斜率和最小斜率一定是maxy和miny的交叉连线,...原创 2020-04-06 15:36:41 · 561 阅读 · 0 评论 -
L3-014 周游世界 (30分)
这个题注意的点有这么几个1.唯一性,我们之前做题都是以点为单位,点是唯一的,但是这个题并不是这样,一个点可能属于多个公司,但是一条边只属于一个公司,所以我们选择使用邻接表,打破了原有的思维2.我们可以看到下面的AC代码里面有vector对vector的赋值,vectora =vectorb,直接可以这样赋值,另外,vector.pop_back()也是不错的,直接删除最后一个元素...原创 2020-03-28 23:15:08 · 1500 阅读 · 0 评论 -
等差数列小应用
这个题用到了等差数列的小性质:an - am =n - m一个区间内,最大值减最小值等于区间长度减一,这就是一个随机序的等差数列试题 历届试题 连号区间数提交此题资源限制时间限制:1.0s 内存限制:256.0MB问题描述小明这些天一直在思考这样一个奇怪而有趣的问题:在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:如果区间[L, ...原创 2020-03-21 13:29:10 · 274 阅读 · 0 评论 -
关于图的题目不给数据范围的情况如何解决
1.就比如L3_08,图中所有边的距离都相等,所以只需要存哪里有边,所以直接vector<vector<int> > a,就可!2.再比如蓝桥杯官网历届真题第九题,边与边之间距离不相等的时候,我们选择vector<vector<pair<int,int> > > a,这种形式来存,加数据的时候我们选择#include<algor...原创 2020-03-21 00:06:41 · 169 阅读 · 0 评论 -
L3_08——图中所有边都是相等的常数
这个题之所以整理是因为他不需要使用Dijkstra,就是利用了所有边都相等的这个特性,直接选择了bfs,即快又省事,所以以后再做图的问题时,先考虑两个搜索可不可行,再做结论L3-008喊山(30分)喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是...原创 2020-03-20 23:59:59 · 189 阅读 · 0 评论 -
树的直径
树的直径:树中,最短距离最长的两个点的距离解决方案:大佬做法:树状dp小孩做法:双dfs利用的性质:随便找一点P找出他最短距离最长的点Q,再对Q点找他的最短距离最长的点W,QW就是直径。画个图自己看看,我也没看明白怎么证的。这个地方用bfs也是可以的,看个人爱好。当然bfs肯定是快点试题 历届试题 大臣的旅费提交此题资源限制时间限制:1.0s 内存限制...原创 2020-03-20 23:56:44 · 267 阅读 · 0 评论 -
L3_01 01背包和最小序列
1. 01背包为什么在枚举前i个物品能构成的最大价值的时候,倒序遍历背包的容量原因:如果正序枚举的话,就变成了多重背包,若倒叙枚举,初始情况下,dp[j-a[i]]是0,但正序的话很有可能是第i个物品已经填充好的了(具体请自行模拟)2. 如何实现最小序列的输出(即本题的卖点,以及整理的原因)原因:这需要从问题本身来分析,如果m的背包恰好装m价值的物品,那么就一定是最优的,我们用一个标...原创 2020-03-17 21:42:13 · 237 阅读 · 0 评论 -
唯一分解求正约数个数
数论题,高度重视也,必整理之!正约数,你别看他说的好听,正的就行?肯定不行啊,那不麻烦死啊,这里用到数论的一个小知识任何一个合数,都能由素数相乘得到,即为唯一分解定理,及其牛逼的定理,非常好用我们一个数,分解为e1个p1,e2个p2...em个pm,那么利用排列组合的知识,每一堆里面有ei+1种选法,故,正约数个数为(e1+1)*(e2+1)*....*(em+1)7-5正约数个...原创 2020-03-07 20:33:22 · 519 阅读 · 0 评论 -
L2-028 秀恩爱分得快
感觉这个题出的很有问题,题目没有保证情侣一定都拍过照,并且所有人的性别不一定都会明确,所以当情侣中有一位没拍过照的时候,就需要打印所有点,那么有些人的性别是不明确的,就出现了很不严谨的问题。 这里我们分析两个思路: 思路1:用string存id,用map<string,double>存亲密值,用vector<vector<string> >存相...原创 2020-03-07 19:31:31 · 373 阅读 · 0 评论 -
利用后中遍历结果,重构二叉树
这个题是利用树的基础,来模拟人为通过后中重构树的过程有个小技巧在于,前中后遍历中,虽然所得结果的排序不同,但是子树所在的区域近乎相同,相差不大于1对于后中重构中,我们很容易得到右子树的根,却难得到左子树的根,利用上述结论,可以间接求出右子树的长度,进而确定中序遍历中,左子树的位置,进而找到后序中,左子树的根具体在哪L2-006树的遍历(25分)给定一棵二叉树的后序遍历和中序遍历...原创 2020-03-03 01:13:34 · 204 阅读 · 0 评论 -
带权并查集
题目解读:对题目的把握需要抓住一共只有三种动物这一点,这很重要,我们可以假设x吃y,y就是x的父亲结点,那么一直延续下去,我们就可以发现x%3 ==y%3同类,x%3 = (y+1)%3x吃y这一点了,有了维护路径这一点,就需要使用带权并查集了带权并查集我们这个题的写法是只有Find函数,并且在Find函数中更新路径,嫁接两颗树的时候,我们只做对原本是根的点进行距离更新,再通过下一次访问这...原创 2020-02-29 22:14:34 · 239 阅读 · 0 评论