洛谷
~VEGETABLEBIRD~
这个作者很懒,什么都没留下…
展开
-
洛谷——P1406 方格填数
非常简单的一道题目。首先,每一行的数之和一定为所有的数之和再除以n。那么根据这个进行dfs并加入剪枝就可以了。#include<iostream>#include<algorithm>using namespace std;int sum, n;int vis[16], a[16];int b[4][4];bool isRight() { int s = 0; for (int i = 0; i < n; i++) { s = 0; for (int原创 2020-05-19 18:58:59 · 365 阅读 · 0 评论 -
P1331 海战
思路非常的简单,先判断是否合法,再用dfs#include<iostream>#include<cstdio>#include<cstring>using namespace std;int r, c;char map[1010][1010];int fx[4] = { 0,-1,1,0 };int fy[4] = { -1,0,0,1 };int dfs(int x, int y) { map[x][y] = '*'; for (int i = 0原创 2020-05-15 16:04:48 · 278 阅读 · 0 评论 -
高精乘法
#include<iostream>#include<string>using namespace std;string a, b;int an[2005], bn[2005];int ans[4010];int main(){ cin >> a >> b; int alen = a.size(); int blen = b.size(); for (int i = 0; i < a.size(); i++) { an[alen原创 2020-05-09 11:36:55 · 133 阅读 · 0 评论 -
洛谷——P1265 公路修建
不知道怎么评价题目,出题人把一个简单的问题搞得不伦不类…其实非常简单,用prim算法求最小生成树即可。#include <iostream>#include <iomanip>#include <cstring>#include <cmath>using namespace std;const int MAXN = 5010;stru...原创 2020-04-27 21:05:21 · 89 阅读 · 0 评论 -
洛谷——P1258 小车问题
很简单的一道应用题。显然,小车应该半路回去接走路的那个人。列个方程求解即可。#include<iostream>#include<iomanip>using namespace std;long double s, a, b;int main(){ cin >> s >> a >> b; cout << fi...原创 2020-04-27 20:34:01 · 228 阅读 · 0 评论 -
洛谷——P1259 黑白棋子的移动
不知道最后四行的规律,就只好这样了…#include<iostream>using namespace std;int n;char a[210];void print() { for (int i = 1; i <= 2 * n + 2; i++) { cout << a[i]; } cout << endl;}void prin...原创 2020-04-27 20:25:17 · 320 阅读 · 0 评论 -
P1253——线性存储问题
思路:贪心。时间=频率*长度,按时间排序,由大到小输出即可。代码:#include<iostream>#include<algorithm>using namespace std;const int MAXN = 10001;int n;struct Inf { int v; int id; bool operator < (Inf &a...原创 2020-04-27 19:41:52 · 341 阅读 · 0 评论 -
P1255——数楼梯
思路:高精+动态规划+滚动数组高精不必再提,f[i]表示第i层楼梯走法,那么状态转移方程为f[i]=f[i-1]+f[i-2],也就是斐波那契数列。当然,不同的是f[n]=n(n<=2)代码:#include<iostream>using namespace std;const int MAXN = 2001;int last[MAXN] = { 1,1 }, now...原创 2020-04-27 19:27:04 · 500 阅读 · 0 评论 -
P1116——车厢重组
思路:求逆序对数代码:#include<iostream>using namespace std;const int MAXN=10001;int N;int a[MAXN];int ans;int main(){ cin>>N; for(int i=0;i<N;i++) cin>>a[i]; fo...原创 2020-04-27 18:53:54 · 162 阅读 · 0 评论 -
洛谷——P1018 乘积最大
原题链接这道题其实动态规划并不难,只是高精有点复杂,我用py 。先说下思路,dp[i][j]表示的是前j个数放入i个乘号的最大值,不是前i个数放入j个乘号的最大值。所以就有动态转移方程dp[i][j]=max(dp[i][j],dp[i-1][k]*a[k+1][j])a[k+1][j]表示的是第k+1位到第j位组成的数。这里我用pyhton实现n, k = map(int, input(...原创 2020-04-13 14:59:02 · 184 阅读 · 0 评论 -
洛谷——P1114 “非常男女”计划
原题链接这里我们引入相对差的概念。很容易知道,如果第i个位置男女之差与第j个位置男女之差相等,那么第i+1到第j个位置男女人数相等。所以,我们可以记录第i个位置的男女之差。最后遍历一遍就好了。#include<iostream>using namespace std;int a[200005], l[200005], r[200005];int max(int a, in...原创 2020-04-13 10:44:45 · 520 阅读 · 0 评论 -
洛谷——P1112 波浪数
原题连接一道很咋呼但其实并不难的一道题。这个题的主要方法是构造。枚举是绝对要超时的,想都不要想 。我们逆向出发,构造出所有的波浪数。代码+注释:#include<iostream>using namespace std;int num[10000005];int a, b, l, r, c;int main(){ cin >> a >> b...原创 2020-04-12 22:42:12 · 446 阅读 · 0 评论 -
洛谷——P1083 借教室
原题链接区间差分#include<iostream>#include<cstring> using namespace std;int n, m;int diff[1000011], need[1000011], rest[1000011], r[1000011], l[1000011], d[1000011];bool check(int x){ ...原创 2020-04-11 16:31:58 · 108 阅读 · 0 评论 -
洛谷——P1095 守望者的逃离
原题链接这个题实际上并不是很难,就是有点咋呼…首先必须明确的一点是,能闪现就闪现,闪现肯定比跑步跑得快。(话说魔法师体质应该不咋滴的,怎么都超过世界纪录了…)这样就和贪心挂上钩了。但是闪现耗蓝,需要跑步作为辅助,所以我们要在闪现过程中时不时跑两下。当然,这个人很烦人,还能回蓝。这就有点棘手,因为不知道对于一个时间点,到底是该休息,还是该跑步(能闪现就闪现)。这样两头一块考虑肯定是一团乱麻,...原创 2020-04-11 11:56:48 · 177 阅读 · 0 评论 -
洛谷——P1040 加分二叉树
原题连接这个题实际上并不是很难,关键有两点。其一是利用动态规划求解出最高加分,其二就是将树的前序遍历输出。动态规划其实非常的简单,dp[i][j]表示的是i到j的区间内的最大加分。那么显然就有动态转移方程dp[i][j] = max(dp[i][j], dp[i][k-1] * dp[k+1][j]+dp[k][k])。而对于求前序遍历,只需要利用一个root[i][j]记录一下i到j区间...原创 2020-04-08 18:58:12 · 138 阅读 · 0 评论 -
洛谷——P1021 邮票面值设计
这个题的大致思路是用搜索找出所有可能的邮票面值种数,在进行动态规划。动态规划很简单,dp[i]表示的是组成价值为i的最小邮票数,那么很简单的就可以得到动态转移方程:dp[i]=min(dp[i],dp[i-a[j]]+1),a[j]是对邮票的面值进行枚举。那么,显然难点在于搜索上了。我最开始的想法是,先把K种面值搜索出来。首先,1肯定是要的。但是搜索的上界并不容易确定。一个明显的一点是,最后一...原创 2020-04-07 16:57:39 · 294 阅读 · 0 评论 -
洛谷——P1111 修复公路
原题连接本题的做法是并查集和Kruskal算法#include<iostream>#include<algorithm>using namespace std;struct Road { int x; int y; int t;}road[100001];bool cmp(Road a, Road b) { return a.t < b.t;}...原创 2020-04-04 09:16:46 · 214 阅读 · 0 评论 -
洛谷——P1077 摆花
一道简单的dp问题。dp[i][j]表示前i种花j个花盆的方案数。那么就有状态转移方程为sum(dp[i-1][k]),其中k的取值是从0到min(j, a[i])。#include<iostream>using namespace std;int m, n;int dp[105][105];int a[105];int mod = 1000007;int min(in...原创 2020-04-04 08:59:49 · 239 阅读 · 0 评论 -
洛谷——P4817 [USACO15DEC]Fruit Feast G
非常简单的一个水题。对于橙子和柠檬所能构成的饱和度的所有情况,可以用ax+by表示。看似要进行复杂度为O(n^2)的枚举,实际上,我们以先枚举x,再枚举y,将其复杂度降至O(n)。#include<iostream>using namespace std;bool f[5000100]={1};//判断饱食度i是否可以达到int a,b,t;int main(){ ...原创 2020-04-02 16:31:21 · 328 阅读 · 0 评论 -
洛谷——P2024 [NOI2001]食物链
这是一道并查集的题目。我们先来分析一下题目。有三种动物,A 吃 B,B吃 C,C 吃 A。那么对于一个动物来说,另一个动物就有了三种情况:同类,天敌以及猎物。很容易可以想到,仅仅是利用普通的并查集已经无法满足需要了,因为我们有三种情况需要表示。仅仅表示同类可以只用一倍长度的数组,那么如果是用三种关系,我们是不是可以用三倍长度的数组呢。我们不妨来尝试一下,声明一个三倍长度的数组。第一倍长度表示的...原创 2020-03-29 19:28:40 · 150 阅读 · 0 评论 -
洛谷——P1257 平面上的最接近点对
原题链接据说暴力可以不过,我们还是采取分治思想,简单的说就是把一个大问题分解成一个个的小问题。那么这道题如何分治呢?很容易可以想到在中间画一条线,求解左右两侧以及跨越左右的最小距离。(可以联想归并排序)按照这样的想法,现将坐标按x排列。思想核心:将所有点分为左右两端,继续分直至左值等于右值或是左值+1等于右值,计算出两点距离。如果left==right,直接返回一个大数即可。接着是...原创 2020-03-27 21:26:12 · 653 阅读 · 0 评论 -
洛谷——P1679 神奇的四次方数
一道很简单的dp水题状态是dp[i]表示第i个数最小n,状态转移方程就是dp[i]=min(dp[i],dp[i-j]+1)其中j是可以开四次方的数#include<iostream>#include<cmath>using namespace std;int dp[100000],n;int main(){ cin>>n; dp[...原创 2020-03-25 23:10:10 · 448 阅读 · 0 评论 -
洛谷——题解 P1564 【膜拜】
先分析题目,是个很明显的DP问题。很容易我们就可以想到dp[i]表示对于前i个人的最少分配的机房数。下面我们开始找动态转移方程。再仔细读一遍题,老师只会把连续一段的同学分进一个机房。这样就简单了。因为老师只会把连续一段的同学分进一个机房,那么对于第i位同学,我们就可以查验第j位同学,是否能够使得j~i都是同一位神牛的膜拜者,或者两个神牛的膜拜者人数差不超过m。如果j满足条件,此时分配的机房数就相...原创 2020-03-23 19:05:42 · 317 阅读 · 0 评论 -
洛谷——P2028 龙兄摘苹果
一道比较简单的DP水题。我们用dp[i][j]表示用i个不同的苹果填充j个篮子的方案总数。那么状态转移方程也就出来了。dp[i][j]=dp[i-1][j-1]+j*dp[i-1][j]。这里的dp[i-1][j-1]表示的是i-1个苹果放入j-1个篮子,第i个苹果放入第j个篮子,而dp[i-1][j]表示i-1个苹果放入j个篮子,第i个苹果随机放置。代码如下:#include<io...原创 2020-03-23 08:50:39 · 241 阅读 · 0 评论 -
洛谷——P2049 魔术棋子
一个比较简单dp问题。我们先来分析一下题目,要找到所有的模的总数,首先可以想到,用dp[i][j]表示在(i,j)这个点所有的方案数。但是,这样显然不行。因为仅仅知道方案总数对求解下一个状态毫无帮助。那么,我们就要记录每一个点所有可能的模。所以,我们用三维dp[i][j][l]表示在(i,j)点是否能够得到模l。即有状态转移方程:dp[i][j][l * num[i][j] % k]=dp[i...原创 2020-03-22 09:51:26 · 228 阅读 · 0 评论 -
洛谷P1387——最大正方形
简单的DP水题…我们先理解题目,如果想要以(i,j)点为右下角构成正方形,那么第一个要满足的条件是在这个点数值为一。如果想要连通其他点,那么左斜上三点必定可以构成正方形。这样,有动态转移方程dp[i][j]=min(dp[i][j-1],dp[i-1][j],dp[i-1]dp[j-1])+1(dp[i][j]==1)代码如下:#include<iostream>using n...原创 2020-03-20 12:44:55 · 279 阅读 · 0 评论 -
洛谷——P1182数列分段
这道题本质上是用到了二分+贪心。先介绍一下贪心。贪心解决的是局部最优解问题,但是如果一个问题每一个的局部的最优解对下一个局部不造成影响,显然这样就成为了全局最优解。那么对于此题是否适用呢?显然,这个题的最优解a是数列中的最大值。而最糟糕的情况b是只能划分为一段,这样就是数列之和。我们不妨从a枚举到b,考虑每一个值是否可行。那么判断可行的条件是什么呢?我们以输入样例为例。4,2,4,5,1。如果选...原创 2020-03-19 10:34:11 · 411 阅读 · 0 评论 -
洛谷——P1157 组合的输出
数据很弱,可以直接搜索加剪枝#include<iostream>#include<string>#include<iomanip>using namespace std;int ans[100];int n, r;void print(int r) { for (int i = 0; i < r; i++) cout << ...原创 2020-03-14 11:30:38 · 330 阅读 · 0 评论 -
洛谷——P1147 连续自然数和
原题链接如果从数学的角度,我们考虑一下,其实没必要用到前缀和。因为是连续序列和,设首项为L,末项为R,序列和就为(L+R)(R-L+1)/2=M,即(L+R)(R-L+1)=2M。不妨令L+R和R+L+1分别为k1和k2,这样就可解出L,R。L=(k2-k1+1)/2, R=(k1+k2-1)/2,假定k1<k2。显然,k1+k2必须是奇数。而L!=R,也就k1!=1。所以得到代码。#i...原创 2020-03-13 18:39:59 · 291 阅读 · 0 评论 -
洛谷——P1044 栈
第一种方法就是搜索,必然超时…#include<iostream>#include<cstring>using namespace std;long long ans = 0;int n;void DFS(int in, int rout) { if (rout == 0) { ans++; return; } if (in == 0) DFS...原创 2020-03-10 15:24:53 · 165 阅读 · 0 评论 -
洛谷——P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
动态规划:原题链接这道题的动态转移方程是a[i][j]+=max(a[i-1][j],a[i-1][j-1])当然,要注意边界问题#include<iostream>using namespace std;int max(int a, int b) { return a > b ? a : b;}int main(){ int n; ci...原创 2020-03-09 09:08:23 · 184 阅读 · 0 评论 -
洛谷P3009 [USACO11JAN]Profits S
原题链接这道题实际上是最大连续子序和问题,解决方案有很多,这里介绍两种。一、动态规划这里我们用一个一维数组a来储存选择第i个元素的最大连续子序和。这样就有转移方程为a[i]=max(a[i],a[i]+a[i-1]),前者表示不选i之前的元素,后者表示选择i之前的元素。这里保证了连续性(思考一下为什么)代码:#include<iostream>#include<vec...原创 2020-03-08 23:01:23 · 220 阅读 · 0 评论 -
洛谷P1049——装箱问题
**从搜索到动态规划(逐步理解)**原题链接1.搜索我们先仔细理解这道题,让剩余空间最小,实际上就是让让放入的体积最大。而对于每一个物体,我们都有放入和不放入两种选择。所以下一层搜索要搜索两个。讲解放入代码中更明白一些。#include<iostream>using namespace std;const int MAX = 20005;int wei[MAX];//储存...原创 2020-02-29 16:20:42 · 367 阅读 · 0 评论 -
大数加减法(洛谷的P1601、P2142)
大数加法:原题连接对于一些范围比较小的数据,利用C/C++自带的数据类型就可以解决。但是对于一些数据比如10^1000000这样的数据,我们如何处理呢?这时,我们就要用到大数运算了。大数运算的根本在于要用字符串或是数组对每一位进行保存。下面介绍一下大数加法。由于大数加法比较简单,我们直接对字符串进行操作,不在用数组了。第一步是以字符串的形式输入两个整数 string a, b; ...原创 2020-02-28 16:58:44 · 747 阅读 · 0 评论