随笔分类 - 数据结构与算法
摘要:KM算法的模板题,记录一下 KM算法 Accepted 2255 468MS 1756K 1600 B G++ #include "bits/stdc++.h" using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 305
阅读全文
摘要:解法: 这题有点像冒泡排序,但是做这题并不需要冒泡排序。 假设第i个小朋友比第j个小朋友高,而且i < j 为了把队伍排成从小到大,第i个小朋友一定要去第j个小朋友的右边。又因为只能交换位置相邻的两个小朋友,所以第i个小朋友一定要和第j个小朋友换位置。同理如果第i个小朋友比第j个小朋友矮,但是i >
阅读全文
摘要:先自己用dp解了一遍,然后看了官方讲解视频是用记忆化搜索做的。感觉那位老师的方法比较容易实现(效率上和我的差不多的);记录一下三种方法。 动态规划 地宫取宝 1.195KB C++ 正确 100 15ms 1.113MB #include "bits/stdc++.h" using namespac
阅读全文
摘要:解法: 一开始不会做,看到标签说是贪心加二分忽然就会了,二分是分的是人口最多居住点的人口,检查人口最多的居住点人口为mid是否可行。贪心是如果从左往右循环就尽量把人口往左迁移,如果从右往左循环就尽量把人口往右迁移。 二分 + 贪心 1053 居民迁移 AC G++ 201ms 7MB #includ
阅读全文
摘要:参考博客: https://blog.csdn.net/mitsuha_/article/details/76690634 https://blog.csdn.net/u014142379/article/details/51761551 解题过程: 先看了第一位大佬的博客,了解了这题的解法,但是没
阅读全文
摘要:有人管蓝桥杯叫暴力杯,现在感觉还是挺贴切的。看到这题首先想到让i从1到n循环,首先判断i中无重复数字,再怎样判断能否用剩下的数构成n - i的假分数。之后看了题解。发现思路错了。 总结两点: 1、蓝桥杯的编程题大多暴力枚举,首先从这个方向想; 2、next_permutation这个函数解决排列的问
阅读全文
摘要:题意: 一个集合里有1到n,两个人轮流从中取数,取出一个数的同时这个数的因子也被取走。取走最后一个数者为胜。判断是否先手必胜。 思路: 一道挺有意思的博弈题。一开始在纸上列出了n为1到6的情况,发现都是先手胜。大胆猜测不管n是多少都是先手胜,发现果真如此。求证方法是后来想到的 现在考虑集合中只有2到
阅读全文
摘要:思路参考自https://www.cnblogs.com/zbh2047/p/9736378.html 贪心 Accepted 6438 234MS 2300K 1054 B G++ #include "bits/stdc++.h" using namespace std; typedef long
阅读全文
摘要:二分 C - Magic Ship GNU C++11 Accepted 31 ms 1700 KB #include "bits/stdc++.h" using namespace std; typedef long long LL; typedef pair<LL, LL> PLL; const
阅读全文
摘要:看到这题讨论版里有说用公式的有说用循环节的,但是个人觉得这两种方法都不靠谱,比赛场上做这种题能直接推出公式需要很强数学功底,而循环节的方法如果循环节比较大就不太好发现了。这种已知通项公式的题还是用矩阵快速幂比较通用,但同是矩阵快速幂,对于这题,也有很大的差异; 注:memmove这个函数可能不太常见
阅读全文
摘要:题意: 输入一个M,然后M次操作。'B'表示增加一个点,坐标为(x, y),如果存在不操作。'D'表示删除一个点,坐标为(x, y),如果不存在不操作。'Q'表示一次询问,输出给定范围内点的个数。 思路1: 如果本题将二维转换成一维。可以用前缀和的思想,假如求线段[y1, y2]上面点的数量可以用[
阅读全文
摘要:欧拉筛 Accepted 2824 343MS 24856K 546 B G++ #include "bits/stdc++.h" using namespace std; typedef long long LL; const int MAXN = 3000005; LL euler[MAXN];
阅读全文
摘要:kmp Accepted 2594 0MS 1484K 671 B G++ #include "cstdio" using namespace std; const int MAXN = 50005; char s1[MAXN], s2[MAXN]; int next[MAXN] = {-1}; v
阅读全文
摘要:思路: 将输入的字符串转换成字典序最小的表示形式,存入set去重。用字典序最大的形式表示也是一样的; 最小表示法 Accepted 2609 62MS 3296K 804 B G++ #include "bits/stdc++.h" using namespace std; char s[205];
阅读全文
摘要:题意: 输入n和m,求n!转换成m进制之后末尾有多少个0; 思路: 转换一下题意就可以看成,将n表示成x * (m ^ y),求y的最大值。^表示次方而不是异或; 这就比较好想了,将m分解质因数,对于每个质因数,设n!含有a个,m含有b个,则ans = min(ans, a / b); 自己比赛的时
阅读全文
摘要:欧拉函数 Accepted 2588 15MS 1372K 916 B G++ #include "bits/stdc++.h" using namespace std; int euler(int n) { int ans = n; for (int i = 2; i * i <= n; i++)
阅读全文
摘要:这题是AC自动机的模板题,AC自动机是结合了字典树,和KMP两种算法产生的,去年为了学习AC自动机去看了前面说的两种算法,但是可能因为KMP当时理解的不够透彻所以这题当时也只是半背代码的做出来了,没多久就忘了。经过那么久的学习感觉KMP掌握的差不多了,今天回顾了一下AC自动机,并记录一下模板 AC自
阅读全文
摘要:题意: 输入q,然后输入q个a,对于每个a,找到一个b,使gcd(a ^ b, a & b)最大,输出这个最大的gcd; 思路: 用k表示a二进制最高位的二进制编号,1,2,4,8对应1,2,3,4; 假如a不是 (1 << k) - 1这种形式的,那么总能找到一个b使a ^ b == (1 <<
阅读全文
摘要:前两天过年,所以两天前的比赛题目现在才来回顾。 这题是一个最平常的递归,加一个剪枝。题目说如果一段距离没有复仇者看守,消耗的能量为A,A一定是正整数。由此可知对于没有复仇者看守的段,不拆一定比拆成两半划得来。只有当这段距离有复仇者看守时,才比较拆开来划算还是不拆划算; 复仇者最多只有1e5个,所以不
阅读全文
摘要:首先,对于这题我们要知道要删除一个数使平均值最大一定是删除最小的数,然后我们假设删除操作执行了i次,也就是删除最小的i个数。在已知删除操作次数之后求增加操作的次数就容易了,当然是m - i和k * (n - i)中比较小的数啦。用一个ans变量记录结果,遍历i,更新ans,得到最终的ans。 B -
阅读全文