- 博客(28)
- 收藏
- 关注
原创 洛谷 P5194
本题先看题目寻找条件:1.每个砝码的质量至少等于前面两个砝码(也就是质量比它小的砝码中质量最大的两个)的质量的和。可以看出每个砝码的最小值是符合一个斐波那契数列的.但斐波那契数列的n到40左右的时候数值就比2的30次方大了,所以N>1000纯粹唬人2.既然数值比较小,我们可以直接搜索,但多次循环暴搜也会超时,这时我们可以使用dfs3.循环暴搜超时的话也要担心一下是否dfs会超时,我们再思考一下,题目要求我们找出最大砝码,那么我们就不一定要从最小的开始找,直接从最大的开始找,深搜保存答案
2022-02-05 17:32:30
343
原创 洛谷 P1219
八皇后相当经典的一道深搜题目依题我们可知n的范围为6-13, 可以用二维数组深搜暴力枚举,但是这样做的话每次深搜都要进行一次循环,很浪费时间。我们可以知道在这道题目中行,列,两条对角线都是相互独立的,那么我们可以用四个数组,分别代表这四个来标记皇后的位置。那么上代码:#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 110;int n;int ans[15
2022-02-02 15:59:56
664
原创 洛谷P3397
本题考查的就是二维差分的应用我们先来了解一下二维前缀和与二维差分:假设我们有一个矩阵a[n][m], 再设它的前缀和为b[n][m], p[n][m]当我们求前缀和时,我们需要的时(i,j)处矩阵的前缀和那么我们的公式为那么要求差分的话, 即求(i,j)处矩阵的差我们的公式为我们又已知:差分进行前缀和运算可得到原数组那么公式为:而当我们在对a数组进行操作c时,比如从(x1,y1)到(x2,y2)+c,则可以这么写那么来看这道题的代码:...
2022-02-01 18:57:44
753
原创 高精度算法
高精度加法#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 505;int a[N], b[N], c[N];string strA, strB;int lena, lenb, lenc;int main(){ ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> strA &g
2022-01-29 16:32:04
654
原创 洛谷P1577 割绳子
先审题,要求每条绳子最小长度的最大值,所以我们使用二分法。因为题目中说了输入输出都是小数,我们可以用double,但是这样会出现其他的问题(比如在二分时精度无法保证),这里只是两位小数,所以我们可以直接用整型存下来,最后除以100。再来看思路:已知要割的绳子的段数和每条绳子的长度,那么我们可以转变一下思路,取一个最大值和一个最小值,再以1的长度来遍历,但这样会爆,所以自然想到二分------->取一个很大很大的值(一定不要取数组里的最大值,血的教训!!!)再不断的取中间值,每次取到一个中间值.
2022-01-26 19:06:41
582
3
原创 洛谷 P1141
这道题是一个联通块的问题,可以用深搜,广搜,并查集做,这里我用的是广搜。但是裸BFS会T三个点,因为数据太大了。这时我们可以想一下联通块,只要某一些点在同一个联通块里面,那么他们的答案肯定是相同的,所以我们可以用一个数组把这些点都标成同一个答案,这样就不用每一次都重置VIS数组上代码:#include <bits/stdc++.h>#include <queue>#define LL long long#define x first#define y secon
2022-01-25 14:34:14
575
原创 洛谷P2768
二分真的好难/(ㄒoㄒ)/~~!首先看题,题目中我们可以知道选手跳跃最短距离的最大值,所以我们可以使用二分。判断是否需要二分可以看题目中是否有类似求最短距离的最大值或者最大距离的最小值。那么本题怎么进行二分呢我们可以以整段距离为一个大区间,然后二分取其中间值,用其中间值来暂时当作一个最大的最小跳跃距离,以此来求需要搬掉几块石头。如果石头搬多了那么说明我们选择的值太大,搬少了,说明我们选择的值太小。最后两个端点就可以确定同一个值了。废话不多说,上代码:#include <bit
2022-01-23 18:33:13
305
原创 洛谷P1024
本题是一个数学方程问题由题可得:三个不同的根之间的距离最小为1,所以我们可以把每个区间1当作一份,在这个区间中进行二分,因为题目要求精度为0.01,所以可以控制精度在两个端点差小于0.001时停止二分,总共循环200次即可。#include <bits/stdc++.h>#define LL long longusing namespace std;const int N = 5 * 1e5 + 10;//typedef long long LL;double a, b,
2022-01-23 17:12:06
639
原创 洛谷P1309
在写本题前要搞清楚几个问题:1.sort函数是以快速排序为基础的2.快速排序和归并排序的区别是快速排序主要用于无序数列,而归并排序是可以用于有序数列的。就像两个有序数列合并时用归并排序最好。3.提示:虽然本题我没有用STL,但是STL库中确实是有sort和merge两个排序的。来分析本题:本题是一道非常好的题,可以帮助我们更深的理解快速排序和归并排序的本质。通常思路是,用结构体储存数据,在不同队伍进行比赛时,每一轮比赛都使用一次快速排序,最后输出我们需要的答案如下列代码
2022-01-22 20:06:39
332
原创 快速排序 洛谷P1177
在学习了快速排序之后把这个思想记了下来,写一篇博客以备自己以后的复习。#include <bits/stdc++.h>#define LL long longusing namespace std;const int N = 1e5 + 10;//typedef long long LL;int a[N];int n;void quicksort(int arry[], int l, int r){ int mid = arry[(l + r) / 2];//取中间数
2022-01-16 23:51:50
348
原创 洛谷P1012
写这道题是为了纪念一下本人在写字符串题型的时候遇到的问题,以及在看了一个大佬的题解之后对字符串的认识更加深刻直接上代码#include <iostream>#include <algorithm>#include <string>//#define LL long longusing namespace std;//typedef long long LL;//const int N = 1e7 + 10;string str[30];int
2022-01-14 16:26:22
82
原创 洛谷P1025
这道题类似于把n个苹果放到k个盘子里且不能空盘子的问题。递归(dfs)做法#include <bits/stdc++.h>//#define LL long longusing namespace std;//typedef long long LL;const int N = 1e5 + 10;int n, k, ans;void dfs(int a, int b, int c)//b为剩余的次数,c为剩余的数的大小,a为从1开始递归,保证不重复{ if (b =
2022-01-14 14:35:56
165
原创 洛谷P1192
本题是一道很简单的递归题,建立一个数组f[],找出f[i]与k之间的关系即可#include <bits/stdc++.h>//#define LL long longusing namespace std;//typedef long long LL;const int N = 1e5 + 10;int f[N];int n, k;int main(){ cin >> n >> k; f[0] = 1; f[1] = 1; for (i
2022-01-14 11:41:17
149
原创 洛谷P1464
很简单的一个记忆化搜索记忆化搜索百度解释:一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。实际上:记忆化搜索可以看作搜索形式(比如dfs)和动态规划的结合,扬长避短。再简单一点就是另外开一个数
2022-01-14 00:15:49
144
原创 洛谷P1306
本题的核心是求解数组合,因为此题比较简单可以使用两层for循环暴力求解,也可以使用回溯+递归进行求解,本人选择的是第二种。递归:将未知的问题缩小,知道访问到已知问题,便开始返回数值,知道解决未知的问题。组合数本质上是二叉树。假设我们要在{1,2,3,4,5}中任取3个进行组合,则有因为我们仅仅是求组合,而不需要排列,又因为组合中的数是无序且不重复的,所以取过的 元素便不能再取避免重复。而每个数都有取和不取两种结果,而回溯法就是模拟上图路径。接下来上代码#include &l
2022-01-13 21:13:31
197
原创 洛谷P1055
学到的新东西:可以先用数组把自己需要的东西存起来(应该可以算是做一个预处理了吧(●'◡'●))。#include <bits/stdc++.h>using namespace std;int main(){ char ch[20], mod[12] = "0123456789X"; for (int i = 0; i < 13; ++i) cin >> ch[i]; int j = 1, t = 0; for (int i = 0; i <
2022-01-11 18:04:17
209
原创 洛谷P2141
此题一定注意”其中有多少个数,恰好等于集合中另外两个(不同的)数之和?“说明1+4 = 5和 2 + 3 = 5是一样的要记得去重!!!#include <bits/stdc++.h>using namespace std;int a[110];int m, sum;bool st[110];int main(){ memset(st, 0, sizeof(st)); memset(a, 0, sizeof(a)); cin >> m;
2022-01-10 16:57:51
309
原创 洛谷P1047
在比赛中能用一维数组,较少的代码就用较少的#include <bits/stdc++.h>using namespace std;const int N = 1e4 + 5;bool st[N];int main(){ int m, l, sum = 0; cin >> l >> m; memset(st, 1, sizeof st); for (int i = 0; i <= l; ++i) st[i] = 1; for (int
2022-01-10 14:55:21
233
原创 洛谷 P1307
#include <bits/stdc++.h>using namespace std;int main(){ int n, m = 0; cin >> n; while (n != 0) { m = m * 10 + n % 10; n = n / 10; } cout << m << endl; return 0;}...
2022-01-10 00:47:31
134
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人