- 博客(42)
- 收藏
- 关注
原创 Codeforces Round #773 (Div. 2) A-C
给出大小为n的数组和倍数x,如果数组中的两个数字满足倍数x的关系那么就可以把他们组合到一起。如果数组中的一个数字在数组中找不到满足x的关系了,就要添一个数字给它组合起来,输出最少要添多少个数字才能把数组中的所有数字组合在一起。给出三角形的三个顶点,问三角形的三条边上的点是否可以和y=0连成一条直线,这条直线不能穿过三角形内部。问三角形的边上存在这样一条直线的点的总长度是多少。给出一个长度为n的数组,输出将这n个数字全部分配给k个孩子(k的大小为1-n)得到的这k个孩子不同的ai数量的和的最小值。
2022-02-24 12:31:11
472
原创 寒假训练 5(单调队列)
然后分析,在每一种报告方案中,我们不能让老板的心情下降到0以下,实际上就是如果报告中最小的前缀和sum[i]-不变的sum[j-1]如果都不小于0,那么这种方案在过程中也不会小于0。前缀和的公式为sum[i]-sum[j-1],sum[i]无法改变,那么我们就是要用单调队列去优化sum[j-1]的最小值使得公式值最大。可以选择一个k值,先报告k-n的消息,再报告1-k的消息,期间老板的心情如果下降到0以下,则主人公会被炒鱿鱼。单调队列是一种队首,队尾都可以执行出队操作的单调递增、递减队列,是一种数据结构。
2022-02-18 19:24:39
418
原创 Codeforces Global Round 19 A-D
因此只有除了两边中间所有的石子堆数量全是1的时候才是-1(只要某个石子堆的数量大于等于2,它就能移出1来,循环下去把所有的奇数石子全移动到两边)当然不要忘了n=3的情况,只要中间是奇数答案就是-1。麻烦的公式推完后发现实际上就是交换ai和bi,求ai和的平方+bi和的平方的最小值和另一个式子(这个式子和交换没有关系,它的值不会变)。有n堆石块,要将中间所有的石块都移到两边,移动方法为对于i<j<k的位置,可以拿走j位置的2个石块分到i和k位置上,输出最小移动次数,如果不能移动则输出-1。
2022-02-13 21:14:03
603
原创 寒假训练 4(大数类)
又写了好多数字好像看出来点规律:大概就是从2开始连续取是最大的情况,然后把余下的数字倒序一个个给原来的那些数,好像有个啥数学定理?反正我是硬找的规律。这里有个不太一样的操作,在循环遍历时我们用的是int,但在执行大数相乘的时候要先把它转化为字符串赋值给大数,然后再进行相乘。一个正整数一般可以分为几个互不相同的自然数的和,求出自然数之和乘积最大的情况,并从小到大输出这些自然数。
2022-01-29 22:50:44
1230
2
原创 Codeforces Round #767 (Div. 2) A-D
给定一个l和r,对l-r进行k次操作(该操作每次取出l-r来的两个数,整合出一个产品,再放回去)进行k次操作后如果gcd(剩下的数)大于1,则输出yes,反之则no。思路:对于一些连续的数字,若其中存在奇数则gcd必为1,所以每次操作就是用一个偶数和奇数整合出一个偶数的产品,这样问题就简化成了l-r中奇数的个数和k的关系了。给出n个长度不超过3的字符串,依次序连接,我们可以删除几个字符串但不能是全部,只要通过删除把剩下的连接成回文串,那么就输出yes,反之no。有点想法,但是感觉会超时。
2022-01-23 22:40:13
247
原创 寒假训练 1(补题)
这个题有点麻烦,总结了很多情况,我们可以大致将它分为两个方向:1.因为每一秒伤害只能增加一点,可能我们的魔法杀死前一只怪物够了,但是不能杀死后一只怪物,这就要求我们必须用多余的魔法杀死前面的怪物,这样递增下去才能杀死后一只怪物;从后向前遍历,对于大于二分答案的x的石子堆全部移走,但是要注意你移走的是它本来有的比x多出来的石子数(不包括后面的石子堆给它的)如果出现小于二分答案x的石子堆,说明x太大了,要缩小,总之这题还是有点水准的。给出怪物的位置i和它的血量,必须要施展魔法在它出现的时候直接杀死它。
2022-01-18 22:07:38
609
原创 Hello 2022 B. Integers Shop
答案最多是剪两次的情况,一次剪r最大的时候,一次剪l最小的时候,剩下的中间部分会直接赠送给我们,然后我们找到价格最小同时又能覆盖到最小的l到最大的r部分的情况就是答案。有条线段,用c价格的钱可以买下l到r之间的整数,给出n组数据,输出能得到最多整数的情况需要的花费,如果有相同整数的情况则输出花费较小的值,同一个整数只能获取一次。更可气的是B差一点就ac了,如果再多给我几分钟那我就直接起飞了,可是并没有,所以我坠落了。我用的是贪心+分类讨论,代码极繁琐,肯定有大佬的要比我的简单很多。
2022-01-04 02:10:26
769
2
原创 Educational Codeforces Round 118 (Rated for Div. 2) A-C
D的难度跨度太大了,先不写了。A. Long Comparison给出一个数字x1,后面添加p1个0,一个数字x2,后面添加p2个0。比较两个数字的大小,输出比较的情况。x和p都是10的6次方的范围,直接乘肯定炸,那我们肯定是一边比一边乘,分情况讨论。1.如果后面加0的个数相同,那么只要比较x1和x2的大小就可以了2.如果加的0个数不同,我们要再分两种情况讨论,具体的看代码吧。#include <bits/stdc++.h>using namespace std;typedef
2021-12-04 14:51:14
479
原创 Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2)
C等我再看看能不能做出来。A. Divide and Multiply给出几组数组,对于每组数组可以选取两个元素,其中一个除二,另一个乘二,输出通过此操作使数组之和最大的结果开始用的排序,后来老是wr,看了下范围直接用两重循环吧。遍历数组每次选定一个要乘2的数,其他的都除二。通过比较这些情况最后得出一个最大的和。#include <bits/stdc++.h>using namespace std;typedef long long ll;int main(){ ll
2021-11-30 00:55:20
347
原创 周练回顾(4)
这个周复习了二分法,并做了洛谷上的一些题个人看到的比较好的二分法模板文章:https://blog.youkuaiyun.com/guslee/article/details/109222477?P1824 进击的奶牛给出n个牛棚和牛栏的位置,牛的个数c,尽量将牛放的距离比较远。输出将牛放置在牛棚里相邻牛距离的最近的最大值。很经典的最小值最大问题,二分答案类的题目可以直接套用模板查找x,关键是写出judge函数来判断这个x可不可行。首先用牛棚的数量减去牛的数量,看看中间可以空出多少位置s。x为两牛距离的最近值
2021-11-27 21:19:40
375
原创 Codeforces Global Round 17 A-C
菜鸟第一次打Global Round,之前虚拟的做了下16的,感觉前四道都很简单,没想到这次比16难那么多…A. Anti Light’s Cell Guessing给出n*m的网格线,其中隐藏了一个坐标,每给计算机一个坐标,计算机会回馈你一个曼哈顿距离,即 |a1−a2|+|b1−b2|,输出在网格线中找出隐藏坐标所需最少的点的数量。大坑题,麻了,我很快就想到如果行和列有1的话1个坐标就够了,其余情况都是2,结果就一直wr,我完美的越过了1 * 1这个特殊情况。在接下来的一个小时中我重复着读题和举例
2021-11-24 20:24:46
402
原创 Educational Codeforces Round 117 (Rated for Div. 2) A-C
比赛的时候没做出C来,是个简单的二分,有点可惜。后来用二分法做了一下也做出来了,感觉是能力范围之内的题…A. Distance有A.B.C三个坐标点,A为(0,0),给出B的坐标点,要求满足两个式子:d(A,C)=d(A,B)/2 d(B,C)=d(A,B)/2 如果能找到C就输出任意一个满足答案的坐标,如果不能找到则输出-1。在编程中除特殊情况外尽量不要出现除法,随时可能会导致错误。把2挪到式子左边比较好,坐标的范围也很小,直接遍历查找就可以了。#include <bits/stdc+
2021-11-23 20:08:22
725
原创 Codeforces Round #755 (Div. 2, based on Technocup 2022 Elimination Round 2) A-C
aik, 注意数组a的下标是i1–ik不是1–k,将数组a和数组b排序,只要对应位置数组b和数组a元素的大小差的不是0或1,那都不能转化(如果相差0可以不变,如果相差1就加1,题目中只有不变和加一这两种转变方法)。这题真的有毒,我本来以为是给一个矩阵,要往里面涂色,求使相邻颜色不同所需要涂的最少方块。结果它其实还可以剪,就随便剪。写一写就知道全剪成1 * 3的矩阵是最少的情况,如果还有剩余就用1*2去剪。所给公式为(x/u)+(y/v)=(x+y)/(u+v),只要把这个公式化简就可以直接做出来了。
2021-11-15 13:54:46
829
3
原创 周练回顾(3)
洛谷 P3143 Diamond Collector SBessie想把大小相差不超过K的钻石同时放在一个陈列架上,它有两个陈列架,问最多能放多少钻石。贪心,排序就完了,但是重点是怎么找出其中两个长度最长的区间。莽了一个多小时失败了,看有人用双指针的做法。我一下想起来不久前做的一个前后缀的题和这个很像(P6877 長いだけのネクタイ),不知道做了多久终于a了…先排序,然后从数组的前、后开始递推,找出从开始往后每一点的最大区间长度和尾部往前每一点的最大区间长度,记录在两个数组中。这样就能找出两个最大区
2021-11-14 20:07:34
629
原创 洛谷 P1680 奇怪的分组
:v 神的班级共有 N 个人,dm 同学想把同学们分成 M 组联络,要求第 i组的人数必须大于给定的正整数 ,输出有多少种不同的方案。10 31233看了标签以为只是个简单的贪心,没想到涉及到这么多数论的知识。1.组合数学:先给每组分配给定的正整数,得出剩下的人数n,把这些人数分配给m组。可以运用隔板法,把这些人分割开需要n-1个板子,把它们分割为m组需要插入m-1个板子。这就转化为在n-1个空位中选m-1个进行插入,则方案数就是C(n-1,m-1)(无序),利用排列组合公式即可算出。2
2021-11-11 20:48:43
296
原创 周练回顾(2)
P1107 雷涛的小猫一只猫从树上向下吃柿子,它可以向下移动1的高度,还可以跳到任何一棵树上,但它的高度会下降delta。输出猫到达地面的时候能吃到的最多的柿子。开始我用的三维dp,第i棵树,j的高度,还需要1层循环记录猫随机跳到其他树上的情况。但这数据量使我毫无疑问的超时了…看到题解中大佬们都优化成二维了…#include <bits/stdc++.h>using namespace std;int a[2001][2001],s[2001][2001];int ans[2001
2021-11-06 19:53:46
139
原创 去除问题()
C. Grandma Capa Knits a Scarf已经写在前一篇博客了,就不赘述了。B. Scenes From a Memory给出t组数字,对于数字,求将其变成1或非质数数字所能保留最少数字个数,输出剩余数字个数和该数字。删掉最多的数字,如果原数中包含1,4,6,8,9.那么只保留该数字即可,如果未包含这些非质数,那么答案就一定为两位数,遍历找出非素数的两位数,将其输出#include <bits/stdc++.h>using namespace std;bool pr
2021-10-29 11:44:05
110
原创 周练回顾(1)
这个周主要用来做题了。洛谷的题有些太难了…一道都要至少花费一两个小时…p4305 不重复数字输入一串数字,去重后将它们输出出来。很水的题,但是不超时很难。map的构造是红黑二叉树,用这个比数组判重快很多,但依然超时了。可能只能用哈希做了,这时候发现了新的方法:unordered_map。它其中是由哈希表构造的,当然比map要快,知道了这个也没难度了。只是平时用的c++编译器运行不了,需要对编译器做一定的调试。p6739 Three friends有一个字符串,将其复制一个并且向其中插入一个
2021-10-24 12:44:20
173
原创 map和哈希的周结
这个周学习了一些第九章字符串内容,做了一些题,就不写getline这种东西了,直接进入正题吧。map和哈希都有判重的作用,在一些题目中两者都可以使用。map的代码相对简便但是时间复杂度高,哈希的代码相对较长但是时间复杂度极小,用于处理一些有特殊要求的题目。1.hdu 2648给出一些商店和其价格的变化,求i天后店铺的排名(1)这题允许用map做,使用map存储商店的价格和变化,用迭代器遍历对商店的商品进行排名,比较容易就能得出。(2)用字符串哈希的方法就比较繁琐了,经典的哈希函数有很多,但我暂时还
2021-10-17 02:02:05
154
原创 二叉树的初识
这个周做了一些题并学习了二叉树,就总结一下二叉树的知识吧。一、二叉树1.二叉树每个结点最多有两个子节点,分别是左孩子和右孩子,二叉树存在满二叉树和完全二叉树等情况。2.遍历二叉树需要用到搜索的知识,用深度优先遍历相对较为简便。3.二叉树有着先序遍历、中序遍历、后序遍历等情况。先序遍历按照父节点、左儿子、右二子的顺序进行组合。中序遍历按照左儿子、父节点、右儿子的顺序进行组合,而后续遍历的顺序则是左儿子、右儿子、父节点。一颗树当已知两种以上的排序方法则能求出整个树(先序+后序属于特殊情况,不能写出)4
2021-10-10 17:51:52
107
原创 高精度计算-10000!
24 ,24 * 5 逐位相乘, 先用24的个位数4进行乘操作(4*5)%10 使a[0]的值变更为0,并且存储sum的值为2,之后在用24的十位数2去乘5 然后加上sum的值2 得出12,12%10=2 变更a[1]的值为2 可是此时12/10=1 出现了新的位数,放到while循环里得到a[2]=1 所以我们发现答案变成了120。位数相同,因此在代码中的操作只是更改答案每一位的值。在for的循环里通过乘法、10的余数保存下来基本位数,余下来的数放到while循环里,得出新的位数。
2021-09-26 22:43:10
101
原创 大一暑假总结
暑假主要学习了《算法竞赛入门到进阶》这本书中的 第三章STL和基本数据结构、第四章搜索技术、第五章高级数据结构、第六章基础算法思想、第七章动态规划 第八章数学学习了高精度计算和数论的内容 第九章字符串开了个头 能掌握并输出学习的大部分内容,但是第五章的二叉搜索树部分 第七章的树形、数位、状态压缩dp被我跳过了除此之外练习了一些对应章节的算法题目,打了几场codeforce虽然其中有很多内容之前上课的时候已经学到了,但是还是感觉了解了很多新知识,其中也有不少我无法彻底理解的,也有我
2021-09-18 23:34:28
126
原创 算法竞赛入门到进阶 读书笔记(7)
一、快速幂计算一个常数的n次幂,如果直接暴力相乘的话有可能会超时,因此使用递归连续计算常数的平方可以减少复杂度int fastpow(int a,int n){ if(n==1) return a; int t=fastpow(a,n/2); 缩小向下递归计算 if(n%2==1) return t*t*a; 如果是奇数递归时会被多消掉一个a,要补上 else return t*t;二、最大公约数和最小公倍数后来才知道有模板,几个月前做了个综合题型,想了好几种方法都超
2021-08-14 20:07:52
103
原创 算法竞赛入门到进阶 读书笔记(6)
贪心法是将整个问题分解成多个步骤,在每个步骤都选取当前步骤的最优方案,直到所有步骤结束的方法。但它是求得局部最优解的方法,对于某些问题不一定能得到最优解。贪心法的基本问题有区间重合,区间覆盖,性价比等问题,这就不过多叙述了,这次主要写一些贪心和其他思想结合的算法。一、Huffman编码Huffman编码是贪心和二叉树结合的算法,是"前缀"最优编码。数据在计算机中都是用二进制码来表示的,一般的编码方式是把每个字符都用相同长度的二进制数来表示,这样并不是节省空间的最优方法,通过二叉树进行编码能够实现空间
2021-08-06 21:27:10
111
原创 算法竞赛入门到进阶 读书笔记(5)
一、线段树1.线段树是一种用于区间处理的数据结构,用二叉树来构造。树的每个结点代表线段[L,R]。当L==R时代表这个结点只有一个点,即为叶子结点;如果L<R则代表这个结点是一个区间,还可以继续往下分为左儿子和右儿子。线段树的操作次数是(log 2 n),复杂度优于直接查找。通过树结点的延伸可知,数量n的区间树最多有4n个结点,因此要设置4n的储存空间。poj 2182: 有编号1-n的牛,对于每个位置的牛,知道前面编号比它小的有多少头,求编号的顺序。给出小的个数的数组c[n] ,通过列举可
2021-08-02 18:21:00
120
原创 算法竞赛入门到进阶 读书笔记(4)
"数据结构并不能直接解决问题,但是数据结构是算法不可缺少的一部分。数据结构能把杂乱无章的数据有序组织起来,易于编程处理。“一、并查集并查集是一种用于处理不相交集合合并问题的一类数据结构,主要操作包含:初始化、查找、合并、统计等步骤。典型例题就是”朋友“问题。合并:确定朋友关系后合并形成新的集查找:通过递归查找根结点以便合并根结点:根结点是一个集合的代表,将根结点并入另一个集也就代表将整个集合并入了一个新的集例:1,2属于朋友、1,3也属于朋友,那么他们都属于同一派系。处理这类问题首先要初始化:
2021-07-27 22:37:24
101
原创 算法竞赛入门到进阶 读书笔记(3)
四、深度优先搜索深度优先搜索会首先从一层探索到最深直到碰壁无法行走,在换另一条路搜索下去,用这个方法走遍所有的路,并且规定不会走重复的路。深度优先搜索的代码通常会比广度简便一些,但像最短距离之类的问题还是要使用广度优先搜索。1 .与递归结合深度优先搜索用递归实现是最普遍的,hdu1312的红黑砖块问题用dfs做就更为简便。void dfs(int dx,int dy){a[dx][dy]='#'; //标记已经走过num++; //走过的砖块数+1for(i=0;i<4;
2021-07-25 21:08:16
105
原创 算法竞赛入门到进阶 读书笔记(2)
一、递归递归是将大问题逐步缩小为最小的同类问题的过程,即n->n-1…->1,一个递归函数直接调用自己就实现了程序的复用。全排列:1.用stl输出全排列next_peimutation()可以不断生成下一个排列,通常由sort排序得到最小序列后不断用next_permutation()生成下一个字典序更大的排列sort(a,a+4);do{ for(i=0;i<4;i++){ cout<<a[i]<<" ";cout<<endl;}
2021-07-23 22:56:59
154
1
原创 算法竞赛入门到进阶 读书笔记(1)
stl容器包括顺序式容器和关联式容器顺序式容器包括vector,list,deque,queue,priority_queue,stack等关联式容器包括set,multiset,map,multimap等一、vector和list数组有静态数组和动态数组两种类型,vector是stl的动态数组,可以节约空间也不易出错,需要时能改变数组大小。删除和插入操作少,访问元素频繁。vector < int> a 定义a的初始化数组vector < int> a(100,6)
2021-07-21 23:33:29
144
1
原创 acm学习的第十一周
这个周主要学习了二分查找法一、二分查找法是在一个单调有序的集合中查找元素,每次判断答案在左右哪部分并且在调整集合上下界,复杂度优于直接查找。因为是在一个单调有序的集合中查找元素,所以在刷的题目中很多都用到了贪心算法的排序方法二分查找法的边界是存在一定问题的,因为mid是由上下界之和除2得出的,不是整数时会自动舍去小数,若直接设定l=mid or r=mid会出现while循环无法结束的情况,所以通常对边界进行加一减一处理比较好二分法的题很多都十分恶心,可能是刚开始学,有些我第一眼都看不出它是二分法
2021-05-24 00:28:06
69
原创 acm学习的第十周
这周主要练习了动态规划中背包的类型题目,学习了二分查找算法的知识,整理一下获得的知识。一、~01背包变形题1.给出一组数据,输入每个奶牛的高度,给定一个高度,求奶牛高度之和对给定高度的最小高度差很基础的题型,只要稍微改动就可以了:先计算出所有奶牛的高度之和,即为背包最大的容量,将每个奶牛的高度当作价值,算出每个背包容量的最大价值 for(i=0;i<n;i++){ cin>>w[i]; sum=sum+w[i];}for(i=0;i<n;i++){ for
2021-05-17 01:18:42
112
原创 acm学习的第九周-背包问题的理解
这个周主要学习了动态规划中的背包部分一、 01背包N件物品放进容量为V的背包,求解价值总和最大值模板:f[i][v]=max(f[i-1][v],f[i-1][v-c[i]]+w[i]);i表示第i件物品,v表示容量,第i-1物品可以选择放或不放,放则容量减去c【i】,价值增加w【i】,不放则保留v,比较两者最大值,最后得出的f[i][v]即为最大价值优化:用f[v]表示最大价值即可,只要有i的循环即可实现f[v]=max(f[v],f[v-c[i]]+w[i]);注意01背包容量的循环
2021-05-10 00:08:14
186
原创 acm学习的第七周
这周主要学习了区间dp,就来整理这周做过的一些区间dp的题1.括号匹配问题大概题意为输入多组数据,以end为结束,每组数据输入几个括号,当出现(和)时或【和】时可以相匹配,则数值增加2,求最后相匹配的括号数#include<iostream>#include<cstring>#include<string.h>using namespace std;int dp[101][101];int main(){ string s; int i,j,k
2021-04-25 00:02:01
72
原创 acm初学的第六周
这周主要做了一些难度不大的动态规划的题一、整理一下做过的所有子序列题1.连续子序列问题(1)最大连续子序列的和,并且输入子序列的首尾两个位置k=1;for(i=0;i<n;i++){ sum+=a[i];if(sum>summax){ summax=sum; be=k; en=i+1;}if(sum<0){sum=0;k=i+2;}}将开始位置设为1,不断比较sum,如果出现了更大的sum则替换,并且尾位置i+1,如果sum<0则前面可以全部替换掉,新的位置
2021-04-18 00:18:48
93
原创 acm初学的第四、五周
最近主要学习了动态规划一、理解动态规划主要是将一个复杂问题划分为子问题,通过子问题的最优解求得源问题的最优解。在做题中最重要的就是通过思考建立动态规划方程,找到合理的子问题逐步递推出整个问题,其次就是要注意初始值,很多dp数组都用到i-1这样的方程,所以应该在循环外定义dp[1] 循环则从2开始二、一些入门的例题一维动态规划:1.求最长子序列首先用dp[1]取出第一个数,然后从第二个数开始依次与左边的数比较,找出每个位置的子序列长度,最后整个比较出最长子序列核心部分for(i=2;i<
2021-04-10 01:43:51
142
原创 acm初学的第三周
一、回顾一些有启发的题1.题的大体意思是给出n组区间,从中取元素构成一个新的集合,要求新集合的元素在每个区间中有两个重合的位置,求满足这个条件集合最小的元素数我开始是想按照区间尾数排序,令用一个数组记录和其他区间重合数最多的元素,想了很久发现我根本写不出来。后来我发现按尾数排序后取一个区间最大的两个元素就可以了,因为最近做了很多(单独用一个数组记录这个元素有没有用过的这种题)我的思路自然就转到记下每个区间最大的两个元素在下个区间有没有用过这样的方法,结果想了一整天也没实现这样的思路,然后我就在网上发现了
2021-03-27 12:54:24
87
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人