随笔分类 -  刷题

摘要:原题链接 题解 反悔贪心,或者说是贪心+优先队列。 code class Solution { public: static bool cmp(vector<int > a,vector<int > b){ if (a[1]!=b[1]) return a[1]<b[1]; return a[0]< 阅读全文
posted @ 2024-12-07 18:14 黑屿白 阅读(2) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 首先,第一感觉是直接按照字符串本身大小排序再相连;但是通过样例二可知此方法错误。 因此,我们重新思考,上面的排序方法错误的原因在于上述的排序满足 s1<=s2,但是不满足s1+s2<=s2+s1(我们称之为加法的传递原则)。此时我们重新定义排序规则:当s1+s2<=s2+s1时就排序 阅读全文
posted @ 2024-12-06 20:39 黑屿白 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 显然采用二分答案,下面讲解 check 函数怎么写。 观察到 n 的属于1000以内,所以我们的check函数可以采用平方的复杂度。 我们采取枚举法,假定 ai 可以达到我们的理想值,那么我们只需要从 i 位置开始考虑 k 怎么分配即可。 code #include<bits/std 阅读全文
posted @ 2024-09-10 16:14 黑屿白 阅读(7) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 题意:找出最大的 X 使得 na+mb=X 其中n,m中至少有一个为负数。 由于a,b互质所以n,m一定有解,即X可取任意整数。 因为n,m至少一个为负数,贪心的想最大的X一定在n=-1或者m=-1的情况。 分类讨论,n=-1时,原式子等价于-a+mb=X,此时m最大取a-1(理由见 阅读全文
posted @ 2024-08-26 15:55 黑屿白 阅读(7) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 着重点:分类讨论+二分中位数 首先,由于要求中位数,我们先将数组进行排序;接着我们取遍所有的ai及其对应中位数。 此时,分歧产生,我们有k次增值的机会,是加到ai(不会改变中位数)上 还是 增值后改变中位数(此时中位数可能改变)? 显然,我们要分类讨论 情况一:我们加到选取的ai上, 阅读全文
posted @ 2024-08-20 21:24 黑屿白 阅读(47) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 本质:贪心+dp 首先当我们面对一个矩形时,肯定是不停的枚举其最小边使得score上涨。 为什么面对多个矩形不行呢?我们可以注意观察到最后一组样例的答案是 35 而非36。 那么此时我们知晓了每个矩形 得到score 分的操作数 设为cost [ n ][ score ]。 接下来问 阅读全文
posted @ 2024-08-16 23:10 黑屿白 阅读(49) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 解法一:三维dp,dp[ root ][ j ][ k ] 含义,以root为根结点的树中只在前 j 棵子树 中选 k 门课程的最大学分。 code #include<bits/stdc++.h> using namespace std; int n,m; int val[305], 阅读全文
posted @ 2024-08-10 19:17 黑屿白 阅读(26) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 首先,位运算很容易想到按位枚举。而这道题的关键是如何快速求区间异或和。 对此,我们构建一个后缀异或数组即可,甚至这个数组可以进一步优化为 cnt1和cnt0 两个变量。(具体实现看code理解) code #include<bits/stdc++.h> using namespace 阅读全文
posted @ 2024-08-07 18:38 黑屿白 阅读(33) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 这题用到的知识点很多, 思维+前缀异或+容斥原理。 1、题目告诉我们要找 被除数个数 是偶数个的异或和,那么什么数的 被除数 有偶数个? 答案:非完全平方数。 2、非完全平方数太多了,不好求。而我们又知道 所有序列 个数为(n+1)*n/2 所以我们只要求出序列异或和为完全平方数的个 阅读全文
posted @ 2024-08-07 14:10 黑屿白 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 首先,对于数字 i 如果location[ i ] < location[ i -1 ] 那么遍历次数需要+1,否则不变。 因此,对于交换的数字 x , y 而言,他们只能影响 x-1 , x+1 , y-1 , y+1 的遍历次数,只需要考虑有限的几种情况即可(需要特判 abs(x 阅读全文
posted @ 2024-07-31 20:40 黑屿白 阅读(29) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 树形dp的想法,递归返回的是子树的最大联合权值以及联合权值之和。 首先,根据题目意思可以知晓该无向图构成的是一棵树。 由树形dp的遍历可知,当我们来到 root结点时,其所有孩子结点的子树 最大联合权值 和 联合权值之和 都已经知晓,我们只需要对其取 max 和 累加 即可。 but 阅读全文
posted @ 2024-07-31 16:53 黑屿白 阅读(7) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 前言:这题可以只调用一遍dfs。 首先,以颜色为color_u的u为根结点的子树内,颜色与u颜色相同的结点 不能与u的其余子树中颜色为color_u的结点相连接。 我们需要一个num数组,num[i]表示当前结点 i ,有多少个结点可以与他连接。 接下来,我们任取一个结点为根结点去跑 阅读全文
posted @ 2024-07-13 10:55 黑屿白 阅读(8) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 假设 sum 数组是从当最大边不超过 i 时边 C 的取值个数 遍历边 a,边 b当 a+b==r 时 ans+=a[r];此时时间复杂度为O(n*n) 优化:定义 s 数组是 a 数组的前缀和 则当b在B~C中遍历时,ans+=s[a+C]-s[a+B-1],优化一个O(n) co 阅读全文
posted @ 2024-07-11 10:49 黑屿白 阅读(9) 评论(0) 推荐(1) 编辑
摘要:cf链接 洛谷链接 方法一 最大最小值问题我们很容易想到二分答案法。那么我们如何写出check函数呢? 对于答案x,若x-i+1<a[i],则选定怪物一定不在 i 位置左侧,即L=i; 若x-n+i<a[i],则选定怪物一定不在 i 位置右侧,R=min(R,i)。 遍历数组,如果L<=R则答案符合 阅读全文
posted @ 2024-06-22 16:01 黑屿白 阅读(8) 评论(0) 推荐(0) 编辑
摘要:cf链接 洛谷链接 解法一 我们观察到每一次的分段会导致后面的分段的Li+1,也就意味着整个式子的答案加上了当前下一位置的后缀和。 即我们假设后缀数组为b,如果要在 i 位置分段,此时ans+=b[i+1];因此我们很容易得出如果 i 位置的后缀和>0则分段,否则不分段。 Ps:如果b[1]<0需要 阅读全文
posted @ 2024-06-22 15:40 黑屿白 阅读(27) 评论(0) 推荐(0) 编辑
摘要:题解 首先,我们来学会如何判断在一系列线段中是否存在不相交线段。 我们选取所有线段中最大的左边界l_max和最小的右边界r_min,我们可以清楚的知晓当l_max>r_min的时候存在不相交线段(贪心的思想),否则不存在。 code #include<bits/stdc++.h> using nam 阅读全文
posted @ 2024-06-11 18:56 黑屿白 阅读(7) 评论(0) 推荐(0) 编辑
摘要:题解 dp数组的含义: dp[i]表示从i-n要删除几个数使得【i,n】的数组是优美的。 此时分两种情况: 1、删除当前位置的数,则dp[i]=dp[i+1]+1 2、不删除当前位置的数,则dp[i]=dp[i+a[i]+1] 因此转移方程为:dp[i]=min(dp[i+1]+1,dp[i+1+a 阅读全文
posted @ 2024-06-02 16:11 黑屿白 阅读(9) 评论(0) 推荐(0) 编辑
摘要:题解 我们只需要将每个数拆成质因数相乘的形式,然后对每个质因数累加,最后观察每个质因数出现的次数是不是数组长度的整数倍即可。 code #include<bits/stdc++.h> using namespace std; const int N=1e4+5; int a[N]; map<int 阅读全文
posted @ 2024-06-02 15:08 黑屿白 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题解 如果整个数组的最小公倍数比数组最大值大的话就直接输出n; 否则满足题目条件的最长子数组的最小公倍数一定是数组最大值的因子。 因此我们只需要去遍历数组最大值的每个因子是否符合条件即可。 code #include<bits/stdc++.h> using namespace std; typed 阅读全文
posted @ 2024-05-29 15:40 黑屿白 阅读(17) 评论(0) 推荐(0) 编辑
摘要:题解 a为b的前缀,只需要设置两个指针即可,l1指向a中当前需要比较的字符,l2指向b中当前字符;如果a[l1]==b[l2]则 l1++,l2++ 否则 l2++。 code #include<bits/stdc++.h> using namespace std; const int N=2e5+ 阅读全文
posted @ 2024-05-03 22:34 黑屿白 阅读(11) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示