洛谷
hhyy_d
这个作者很懒,什么都没留下…
展开
-
5.1题解---棋盘+Cow Travelling S(搜索)
1、棋盘解题思路:(1)用dfs,最优性剪枝:每次进入dfs更新从1,1到x,y的最小花费,如果大于已经存储的值,那么就可以停止了。用一个变量来记录是否可以使用魔法,使用魔法之后将颜色变为与父节点一样。#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1010;int n,m;int dist[N][N],g[N][N];原创 2022-05-02 13:14:59 · 261 阅读 · 0 评论 -
旅行家的预算(洛谷)
题目链接:旅行家的预算解题思路:题目的目标是求出最小的油费,如果我们知道在每个加油站都加了多少升油,那就可以求出油费了,最小也就意味着在每个加油站加的油最合适。思考什么叫做合适,假设我当前处在第index个加油站(起始在第0个),如果我把油加满了,最远能走到的距离假设为maxdist,如果从当前加油站到maxdist中还有其他加油站的邮费比当前加油站油费低,那我就可以走到那个加油站(next)进行加油,我在index加的油刚好走到next就行。解题过程:上面是本题的关键思路,在解题过程中需要考虑多中情况原创 2022-02-23 18:15:03 · 420 阅读 · 0 评论 -
P1318 积水面积
解题思路:对于每一个点,去往前找比它大的第一个数,去往后找比他大的第一个数,然后算min(arr[left]-arr[i],arr[right]-arr[i]),答案加上这个值乘以(right-left-1),如果在往前找的时候,发现某个数和他相等,那么说明之前已经处理过了,就不处理了,直接返回。#include<bits/stdc++.h>#define MAX 10001using namespace std;int n;int arr[MAX];long long res=..原创 2021-12-04 16:26:00 · 766 阅读 · 0 评论 -
P1160 队列安排
解题思路:用双向链表进行模拟,为了能够快速找到每个序号对应的节点位置,用一个unordered_map<int,Node*>进行维护,代码如下:#include<bits/stdc++.h>#define MAX 100001using namespace std;struct Node{ int data; Node *right; Node *left;};int n,m;int visited[MAX];unordered_map&..原创 2021-12-03 12:59:23 · 199 阅读 · 0 评论 -
P1077 [NOIP2012 普及组] 摆花
暴力递归如何到记忆化搜索原创 2021-12-02 20:13:07 · 1075 阅读 · 0 评论 -
P1061 [NOIP2006 普及组] Jam 的计数法
解题思路:对于每一个字符串,判断第n-1个位置能不能放,如果不能再去前面找,如果可以,就把从当前位置开始,所有的值都往后加一位。这里我用一个map维护数字与字符之间的映射,方便查找。发现规律:倒数第i位数的值不会超过t+1-i。#include<bits/stdc++.h>#define MAX 27using namespace std;int s,t,w;vector<int> arr;//存储字符串对应的位置map<int,char> mp;//维护..原创 2021-12-02 16:47:21 · 1149 阅读 · 0 评论 -
P1332 血色先锋队
解题思路:运用广度优先的搜索,从每一个感染源开始搜索,如果当前位置没有被搜索过,就标记时间。#include<bits/stdc++.h>#define MAX 501using namespace std;using gg = long long;int n,m,a,b;int spend_time[MAX][MAX];//时间queue<pair<int,int> > q;//感染源队列vector<pair<int,int> &..原创 2021-11-29 22:39:02 · 219 阅读 · 0 评论 -
P1508 Likecloud-吃、吃、吃
暴力递归到记忆化搜索:从40分到100分的过程暴力递归思路:这个人每次吃只能吃前方,左前方,右前方,一共有三个状态,变化参数为坐标,从n+1行开始到0行,(1~n为食物摆放),设f(x,y)表示从x,y出发,吃完的最大能量值,暴力解题如下:#include<bits/stdc++.h>#define MAX 205using namespace std;int n,m;int arr[MAX][MAX];int process(int x,int y){ /*if(d..原创 2021-11-21 00:39:25 · 963 阅读 · 0 评论 -
P1135 奇怪的电梯
解题思路:回溯法,对每一个楼层都有上下两种方法,只要合法(>=1&&<=n)都可以去。结束递归的条件是当前的step大于res,记得回溯修改已经访问的点为未访问。#include<bits/stdc++.h>#define MAX 201using namespace std;int n,a,b;int arr[MAX];//存储每一层电梯的数字int visited[MAX];//该层是否访问过int flag=0;//是否有解int res =..原创 2021-11-13 17:58:49 · 527 阅读 · 0 评论 -
P4086 [USACO17DEC]My Cow Ate My Homework S
解题思路:看代码#include<bits/stdc++.h>#define MAX 100001using namespace std;using gg = long long;gg n;gg arr[MAX];gg dp[MAX];//去除最小值后 后面数的和gg min_num=1e9;double max_avg;//最大平均值unordered_map<int,double> mp;//去掉前i个值的平均值,i->avg,用这个是因为它比较快,..原创 2021-11-12 21:53:52 · 465 阅读 · 0 评论 -
P3662 [USACO17FEB]Why Did the Cow Cross the Road II S
解题思路:要有k个连续编号的灯,则枚举每个长度为k的区间,假设把这个区间的全都修好,求其最小修好的灯的数量。区间固定,所以考虑枚举每个区间的情况,在输入的时候初始化,如果灯坏则light[i]为1,否则为0.1.把每一个区间灯坏的情况做一个统计(前缀做统计),然后从k开始扫描这个数组,计算需要修好多少盏灯,取最小。#include<bits/stdc++.h>#define MAX 100010using namespace std;using gg = long long;..原创 2021-11-12 17:55:53 · 252 阅读 · 0 评论 -
差分数组P3406 海底高铁
解题思路:首先想到的是把每一段路经过的次数记录下来,最后使用贪心的思想去找到哪一种方式更省钱即可,但是这样暴力的去对每一个区间进行加一操作会超时,使用差分数组和前缀和即可快速计算每一段路的情况。差分数组概念代码如下:#include<bits/stdc++.h>#define MAX 100001using namespace std;using gg = long long;gg n,m;gg cf[MAX];//差分数组gg res=0;struct node{ ..原创 2021-11-12 16:34:56 · 117 阅读 · 0 评论 -
P3138 [USACO16FEB]Load Balancing S
解题思路:数据离散化+二维前缀和。什么是数据离散化:输入数据中数据点比较少,但是它的点的值可能很大时,就把它映射到一个小坐标当中,相对位置不变,例如 10,100,1000可以映射到1,2,3.二维点映射:(x,y)->(m,n),其中m为按照x坐标排序后,原来x所处的序号,n为按照y坐标排序后,原来y所处的位置。#include<bits/stdc++.h>#define MAX 1001using namespace std;int n;struct node{ ..原创 2021-11-11 21:45:36 · 145 阅读 · 0 评论 -
二维前缀和
平常我们都是使用一维前缀,s[i]=s[i-1]+x;二维前缀更新公式:原创 2021-11-11 16:53:07 · 187 阅读 · 0 评论 -
P1865 A % B Problem
解题思路:暴力打表,然后判断就行#include<bits/stdc++.h>#define MAX 1000001using namespace std;using gg=long long;gg n,m;//查询次数和右端点gg arr[MAX];//素数表,前i个数一共有多少个素数bool check(gg num){ for(int i=2;i<=sqrt(num);i++) { if(num%i==0) { .原创 2021-11-11 16:25:54 · 47 阅读 · 0 评论 -
P1387最大正方形
解题思路:前缀和+二分+暴力枚举#include<bits/stdc++.h>#define MAX 200using namespace std;using gg=long long;int n,m;int arr[MAX][MAX];int res=0;bool check(int xmin,int ymin,int r){ int xmax = xmin+r; int ymax = ymin+r; if(xmax>=n||ymax>=.原创 2021-11-11 15:52:37 · 48 阅读 · 0 评论 -
P2678 [NOIP2015 提高组] 跳石头
二分答案:去寻找石头间最小距离到最大距离,假设给定了一个值,按照这个值去移石头,如果之间的距离小于这个值,则需要把石头移走,合并到下一个值去判断,如果移走的石头数量小于等于题目中给出的,说明我们可以往大的距离去靠近,否则,减小这个距离。这里需要注意最后一个石头到终点的距离也要记上。代码如下#include<bits/stdc++.h>#define MAX 1000001using namespace std;using gg=long long;gg L,n,m;gg arr[..原创 2021-11-10 23:44:52 · 99 阅读 · 0 评论 -
P1873 [COCI 2011/2012 #5] EKO / 砍树
使用二分答案,当前值去判断,如果木材总数大于等于需求,说明还可以再高一点试试,否则应该再低一点。#include<bits/stdc++.h>#define MAX 1000001using namespace std;using gg=long long;gg n,m;gg arr[MAX];gg res=0;bool check(gg mid){ gg sum=0; for(gg i=0;i<n;i++) { if(arr[..原创 2021-11-10 22:06:10 · 274 阅读 · 0 评论 -
P1182 数列分段 Section II
二分答案:将最值问题转化成为一个判定问题,即选择一个x,看是否符合要求,若符合,则左边的都符合,可以去右边寻找,否则去左边寻找。有一个check函数和二分查找构成#include<bits/stdc++.h>#define MAX 100001using namespace std;using gg=long long;gg n,m;gg arr[MAX];gg arr_sum[MAX];gg res;bool check(gg mid){ gg sum=0; ..原创 2021-11-10 21:49:55 · 76 阅读 · 0 评论 -
P1114 “非常男女”计划
解题思路:计算每一次的男女数量差以及相同差的序号,最后扫描一遍,找到最长即可,需要注意一类数据比如 0,1时,答案应该为2,所以序号从1~n开始遍历,但是mp[0]=[0]。#include<bits/stdc++.h>#define MAX 100001using namespace std;using gg=long long;gg n;int arr[MAX];int res = 0;map<int,vector<int> > mp;int m..原创 2021-11-10 19:46:05 · 171 阅读 · 0 评论 -
P1238 走迷宫
解题思路:用dfs+回溯即可解决问题,注意回溯的修改还有就是顺序为左上右下,还有没有答案时输出-1.#include<bits/stdc++.h>using namespace std;using gg = long long;int n,m;int visited[20][20];//访问数组int arr[20][20];int end_x,end_y;vector<vector<pair<int,int> > > res;void ..原创 2021-11-05 22:40:24 · 116 阅读 · 0 评论 -
P1215 [USACO1.4]母亲的牛奶 Mother‘s Milk
解题思路:首先明确两个概念:1.对于某一个桶,如果它不为0,则可以向别的没有满的桶倒牛奶。2.桶的情况唯一。基于以上两点:(1)定义一个map<vector,int> mp,其中key表示桶的状态,val为1表示这种情况在以前已经出现过了。(2)定义一个队列,表示多种桶的状态,初始时,桶的状态为 0,0,c,往后如果下一个状态没有出现过,则将其加入到队列中,队列为空时,退出。代码如下:#include<bits/stdc++.h>using namespace s.原创 2021-11-04 22:01:55 · 174 阅读 · 0 评论 -
P1209 [USACO1.3]修理牛棚 Barn Repair
注意:题目没有告诉给出有牛的牛棚序号是递增的,需要自己先排序解题思路:用贪心的思想,用一个数组存储每一个牛棚与前一个牛棚差距的值,然后从中选择最大的m-1个值,以它们的编号进行划分,最后求这些编号直接有多少个牛栏就可以了。几个特殊点需要注意:m>=c||c1,输出都为c; m1时,就是输出最大值到最小值之间的长度。#include<bits/stdc++.h>#define MAX 300using namespace std;int mi,si,ci;int cow[...原创 2021-11-04 20:47:47 · 255 阅读 · 0 评论 -
P1057 [NOIP2008 普及组] 传球游戏
解题思路:1.40分做法:采用dfs进行遍历,当满足传球次数达到m次的时候检验此时球在不在第一个同学手里。图示:原创 2021-11-04 18:24:06 · 2272 阅读 · 0 评论 -
数的划分(dfs+剪枝)
题目描述将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,51,1,5;1,5,11,5,1;5,1,15,1,1.问有多少种不同的分法。输入格式n,k (6<n <=200,2≤k≤6)输出格式1 个整数,即不同的分法。输入输出样例输入7 3输出4说明/提示四种分法为:1,1,51,2,41,3,32,2,340分做法:主要思路:本题很容易想到的方法是枚举1~(n-s原创 2021-10-27 01:04:31 · 235 阅读 · 0 评论 -
阶乘之和计算
题目描述用高精度计算出 S = 1! + 2! + 3! + \cdots + n!S=1!+2!+3!+⋯+n!(n \le 50n≤50)。其中“!”表示阶乘,例如:5! = 5 \times 4 \times 3 \times 2 \times 15!=5×4×3×2×1。输入格式一个正整数 nn。输出格式一个正整数 S,表示计算结果。输入输出样例输入 #1复制3输出 #1复制9说明/提示【数据范围】对于 100 %100% 的数据,1 \le n \le 501≤n≤50原创 2021-08-19 20:50:41 · 827 阅读 · 0 评论 -
方格取数(洛谷,c++)
解题思路:此题可以看成是两个人同时从A点出发,到达B点的最大和。所以可以用一个四维数组dp[i][j][k][l]来存储答案。状态转移方程如下:f[i][j][k][l]=max(f[i−1][j][k−1][l],f[i−1][j][k][l−1],f[i][j−1][k−1][l],f[i][j−1][k][l−1])+a[i][j]+a[k][l];如果他俩走过同一条路,则需要减去一个a[i][j].代码如下:#include<iostream>#include<math..原创 2021-08-18 16:07:41 · 1181 阅读 · 0 评论