- 博客(40)
- 收藏
- 关注
原创 洛谷 P1334 合并果子变形
https://www.luogu.com.cn/problem/P1334 思路 上来就想着,从大到小排序一下,然后每次砍掉最大长度的那一段,不就ok了吗?码之,WA了。不出意料 仔细一想,切割的时候可以从中间切开,迅速缩小长度,每次砍掉最大长度看来并不是最优解。 每次选一根木棒砍成两段,所消耗能量是两段木棒的长度和。我们用逆向思维:每次选两根木棒拼在一起,使得长度和最小,这样能量也就达到最小。这就是一个合并果子的变形而已。。。直接就优先队列冲了。 代码 #include <bits/stdc++.
2021-05-19 21:12:04
250
原创 CodeForces - 670C
https://vjudge.net/problem/CodeForces-670C 对于我这个新手,此题略难。 (话说这个不是离散化+二分吗,怎么被划入排序了) 题目概括 一群科学家挑选电影看。每个科学家只会一种语言(用序号表示)。一部电影有两种语言:音频语言与文字语言。问选取那部电影可以使得看懂音频语言的科学家最多。(若同样多,则选取使得看懂文字语言的科学家最多的电影) 思路 首先,我们必须知道每一种语言掌握的人数是多少。显然,桶排序是一个不错的选择。 可惜,给的区间范围是[1,1e9]。所以要离散化。
2021-04-19 20:44:27
289
原创 hdu 3092 0/1背包+数论
https://vjudge.net/problem/HDU-3092 题目概括 给出两个数字n,m,求n的所有划分里划分出的数字的最小公倍数的最大值ans,输出ans%m。 注意,ans可以很大很大很大。 思路 借鉴了https://blog.youkuaiyun.com/xuejye/article/details/80274052 首先说一下设计算法求最小公倍数的最大值。 最小公倍数要最大,我们希望划分里面要多出现素数。因为全部素数对于最小公倍数的贡献最大(全部乘在一起) 标准格式是:n=p1^k1 * p2^k
2021-04-14 23:23:07
149
原创 hdu 2955 0/1背包/概率dp
https://vjudge.net/problem/HDU-2955 题意概括 给出小偷偷各家银行被抓的概率和所获得的钱数,给出允许被抓的最小概率值p(挺怪的),试问在被抓概率不超过p时,所能偷到的最多钱数。 思路 先搬出大佬的思路,可供参考~~ https://blog.youkuaiyun.com/a1097304791/article/details/83586769 0/1背包这个不难想,但是很容易把概率当做背包容积,钱数当做dp值,其实有两个问题: 1.概率是小数。当然,你可以乘上10^n倍,就算解决了吧。
2021-04-14 23:07:27
158
原创 hdu 2159 完全背包
https://vjudge.net/problem/HDU-2159 原题复制粘贴 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗? 思路 这题目很容易想到完全背包(算
2021-04-13 22:39:53
173
原创 hdu 2844 coins 多重背包
https://vjudge.net/problem/HDU-2844 题目大意 给出一些硬币的数值和数量,给定一个上限m,求这些硬币在上限m以下能够覆盖的钱数的数量。 思路 多重背包用在这题目还是很巧妙的。(事实上有不用背包的dp算法,但是不够快)最关键的是一个dp[i]==i的细节,比较有趣。 多重背包之所以快还是那个二进制优化。 代码 #include <bits/stdc++.h> using namespace std; const int maxn=1e5+5; int n,m,d
2021-04-13 22:31:50
159
原创 poj 1061 拓展欧几里得+同余方程
题目概括 https://vjudge.net/problem/POJ-1061 简单来说,两只青蛙逆时针在一个长度为L的环上跳,给出青蛙的初始位置x,y和一次跳的长度m,n,问是否能够相遇 思路 https://blog.youkuaiyun.com/qq_41280600/article/details/103036453 这位大佬写的很简洁,我也是借鉴了他的思路。 这道题,我们首先要列一个二元一次方程。 设两个同向而行的青蛙在t时间后相遇,那么两者的路程差一定是L的倍数。 所以有: x+mt-(y+nt)=kL;
2021-04-08 21:10:32
111
原创 hdu 3117 斐波那契数列+矩阵快速幂
题目概括 求第n个斐波那契数。这个n可以很大(10^8)。输出的时候,如果数字不足9位,则输出该数字;否则输出该数字的头四位和尾四位。 思路 参考了这位大佬的输出前四位部分(不是一般的尴尬)https://blog.youkuaiyun.com/qq_45034708/article/details/107790982 好吧,先说说前四位。我们可以直接用下面这个公式 感谢百度 怎么用呢?因为当n很大,后面那项直接忽略,前面那项又太大了,所以我们取一个对数(log10),用double存起来。 然后,这个数的小数部分取
2021-04-07 21:51:45
186
原创 hdu 1532 Edmonds-Karp
题目大意 求最大流。(从原点到终点)每一条边都是单向边。 思路 刚学习Edmonds-Karp这种虽然低效但是好写的算法~~ 现 学 现 卖 Edmonds-Karp是Ford-Fulkerson的BFS实现,核心有二:残留网络和反向路径。只要BFS能够搜到一条通路,那么就返回这条路径的流量,并加入最终的结果(Mflow)里面。 反正这种算法也是不能对付较大的图的,直接邻接矩阵搞定。 代码 #include <bits/stdc++.h> using namespace std; const
2021-04-06 19:31:48
107
原创 用十字链表实现矩阵加法
题目复制粘贴 感谢https://blog.youkuaiyun.com/npuyan/article/details/80464459?spm=1001.2014.3001.5501 这位代码写的很好 细节 创建十字链表并不是非常难。我借鉴了这位(https://blog.youkuaiyun.com/zhuyi2654715/article/details/6729783)的写法,写的很清楚,但是不能实现同一处连续插入两次的操作。 最难的还是加法。我们假设把B加到A上面,那么,就存在添加新结点,不加不减(做加法未得到0),删
2021-04-01 21:04:51
1401
原创 hdu 2544 Bellmann-Ford及其变形
#https://vjudge.net/problem/HDU-2544 题意概括 寻找单源最短路径。 代码(多个) 在学习Bellmann-Ford算法及其变形SPFA,感觉挺有意思,就都写了一遍,以供学习。 淳朴的Bellmann-Ford #include <bits/stdc++.h> using namespace std; const int maxn=1e4+5; const int inf=1e9; struct node { int u,v,w; }edge[2*ma
2021-03-30 23:08:34
126
原创 2021-剪枝TRN-M
https://vjudge.net/contest/425323#problem/M 原题复制粘贴 给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只包含0或1。求最小的M。 例如:N = 4,M = 100。 思路 感谢启发 参考文章 首先说框架。 先看存储。由于最后的数字可能非常非常大,longlong也不行,所以要用字符串来保存。 再看遍历方法。显然,原来的数字一倍两倍的做乘法是很慢的,我们实际上只要直接枚举含有0/1的数字,然后判断是不是n的倍数就好 遍历的时
2021-03-26 21:54:42
183
原创 用循环队列求解k阶斐波那契数列
题目大意 感谢https://blog.youkuaiyun.com/LanXiu_/article/details/107118571 思路 这个题目很巧妙,说实话也开了眼界。 (虽然明明可以用数组,而且数组有更快的算法) 首先是初始化的问题。k阶不一定是二阶,所以在一个容量为k的循环队列(实际上要开容量到k+1,以便判队列满,不过这不重要,因为可以不判 )中,我们先压进去k-1个0,再压进去一个1,这就完成了初始化。 然后就是循环,细节也很多,看代码吧。 代码 #include <iostream> #
2021-03-24 21:58:42
1679
原创 用数学方法求高精度pi
题意 用双向循环链表为存储结构解决高进度pi问题。pi值要精确到第几位,就输出到第几位。 思路 首先给出我们计算pi的理论依据 行了,从这个结构上就可以看出来,要有两个链表,一个存放一项的值(不断迭代),一个存放这些项的和(也不断迭代) 当然链表的每一个节点存放一个数位。其实用数组也是可以的。 既然是精度很高,那么肯定是要手动加减乘除了。 居然调了好几次才把这加减乘除搞定 代码 细节挺多,不一一说了。 //高精度计算PI #include <stdio.h> #include <stdl
2021-03-23 22:41:50
427
原创 2021-bfsTRN-K
https://vjudge.net/contest/425322#problem/K 原题复制粘贴 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表
2021-03-22 00:31:21
108
原创 数据结构之多项式add
测试数据不多,可能有bug,不过至少现在还能用~~ 代码 #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> #include <queue> using namespace std; int n,m; typedef struct node { int coef,exp; s
2021-03-15 20:28:18
155
原创 2021-bfsTRN-J
https://vjudge.net/contest/425322#problem/J 题目概括 给定容积的三个杯子倒可乐(必须倒到一个杯子没有可乐或者一个杯子装满),问能否平分。 思路 很像数学题(他确实是),为什么和bfs有关呢? 因为三个杯子的可乐体积代表了一个状态。状态数有限,所以可以bfs。每次拓展时,分六种情况讨论是那个杯子里的可乐倒到那个杯子里面去,这题就搞定了。 (代码好长) (数学做法不会,有空学~~) 代码 #include <stdio.h> #include <st
2021-03-14 20:09:02
130
原创 2021-bfsTRN-I
https://vjudge.net/contest/425322#problem/I 题意概括 一个图上,标定两个人的初始位置和所有肯德基的位置,两个人在任意一个肯德基相遇时步数之和的最小值 细节 WA*n以后,才知道自己有多傻。。。 在分别以两个人的位置为出发点广搜时,要记录到任意一个肯德基的距离。但不是所有肯德基都能到达。所以这个时候就要有一些小技巧了。 注意下面的memset。 代码 #include <stdio.h> #include <string.h> #includ
2021-03-14 20:00:05
236
原创 2021-bfsTRN-E
https://vjudge.net/contest/425322#problem/E 原题复制粘贴 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 细节 本不想为这个shuiti写博客,但是毕竟这里有一个输
2021-03-14 19:23:36
93
原创 2021-bfsTRN-B
https://vjudge.net/contest/425322#problem/B 题目大意 从数轴上A点出发(坐标n)到达K点(坐标k)。有两种移动方法: 1.左右横跳 向左一格或者向右一格 2.跳到目前坐标两倍的地方 问最少需要多少步。 思路与细节 这个题用bfs,因为到达的每一个点都是一个状态。不太适合dfs,很难划定什么时候dfs该停下来,而且问的是最少用多少步,所以必须是bfs。 但是要注意bfs的边界条件。 首先,坐标要一直>=0。其次,由于限定了n,k的上界,所以当bfs后超过上界以
2021-03-14 18:53:24
123
原创 2021-dfsTRN-F
https://vjudge.net/contest/425321#problem/F 原题复制粘贴 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为了简单起见,我们的游戏只有同一花色的10张牌,从A到10,且随机的在一行上展开,编号从1到10,把第i号上的牌移到第j号牌上,移动距离为abs(i-j),现在你要做的是求出完成游戏
2021-03-09 21:53:05
158
1
原创 2021-dfsTRN-Q
https://vjudge.net/contest/425321#problem/Q 题意概括 在一个网格图内,判断是否有长度至少为4的环。 思路 判断环的方法有很多种,但是这个题目可以投机取巧。 借鉴了这位大神的思路,实在是妙啊。 https://www.cnblogs.com/kindleheart/p/9296793.html 做法是:在dfs向四个方向拓展的时候,假如说此时的点是(x,y),然后拓展出一个合法的(nx,ny)。 这时候我们再拓展一次,由(nx,ny)拓展出(mx,my)。 那么
2021-03-06 17:58:57
150
原创 2021-dfsTRN-K
https://vjudge.net/contest/425321#problem/K 题目概述 素数环问题。要按照字典序输出素数环。 (吐槽一下,那个题目中的顺时针逆时针太误导人了,和那毫无关系) 思路 可能我还不太熟悉输出所有情况的题,导致做的有点卡。。不过不要紧。 用数组记录已经dfs假设的答案,如果答案确实符合条件,就顺势在dfs内输出并回溯。 最后要注意输出行末没有空格。PE了一下 代码 #include <stdio.h> #include <string.h> #inc
2021-03-05 23:00:16
129
原创 2021-dfsTRN-G
https://vjudge.net/contest/425321#problem/G 题意概括 在一个网格中给定出发点和终点,给定用的步数,试问能否恰好在该步数内走到终点。 细节 剪枝。好坑。(其实还是打的题目太少) 最需要认识到的问题是: 无论走什么路线,到达终点用的步数的奇偶性与(横坐标偏量+纵坐标偏量)相同。 这样就可以排除掉一些可能性了。。。 代码 #include <stdio.h> #include <string.h> #include <iostream>
2021-03-05 19:43:17
105
原创 2021-dfsTRN-D
https://vjudge.net/contest/425321#problem/D 原题复制粘贴 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。 思路 很像八皇后问题,所以我们还是一行一行的枚举,用col记录某一列有没有被占用就好。 但是呢,一开始有个细节没顾及到。摆放的棋子个数可以小于棋盘大小n,所以完全可以某一行不放棋子。要小心。 代码 #incl
2021-03-03 20:50:37
154
1
原创 2021-dfsTRN-B
https://vjudge.net/contest/425321#problem/B 题意概括 给一串单调不增的数字,用这些数字凑出一个整数。经典的凑数字问题。但是比较麻烦的是输出,需要输出所有的可能情况,并且不能有重复。 思路 如何做到不重复呢? 方法是,在dfs的时候,记录下已经选到的数字的下标。我们首先要保证选到的数字的下标是单调递增的。 其次,因为一串数字可能会有重复的,所以当我们一次dfs搜完后,我们要剔除重复的数字。具体方法见下。 代码 #include <stdio.h> #in
2021-03-03 20:06:27
176
2
原创 2021-TRN1-Q
https://vjudge.net/contest/418600#problem/Q 题意概括 在x轴上,一只青蛙在0点处,一次最多可以跳L格,要跳到m。但是青蛙途中跳到的点只能是“特定点”。原来已经给出了一些特定点的位置,现在你可以在数轴上面任意放一些特定点。求青蛙跳的最多的次数。 细节 参考了https://blog.youkuaiyun.com/yeyeyeguoguo/article/details/44244569 总体思路不难。很容易发现,取一个L+1的区间,最多要跳两次。所以我们就是要在数轴上找有多少个
2021-03-01 21:12:21
111
原创 2021-TRN1-J
https://vjudge.net/contest/418600#problem/J 题意概括 在[a,b]找一个x,[c,d]找一个y,使得x^y最大。 思路 最妙的地方就是这题看待数字的方式。以往都是看成十进制数,这里是看成二进制数。 由于二进制数高位对数字大小的影响超过了低位影响的总和,所以我们贪心地从高位枚举。(算了一下,2^60足够) 每一个数字都是由2^n的和凑出来的。每一个二进制位是1还是0要具体分析。下面上代码。 代码 #include <bits/stdc++.h> usi
2021-02-28 19:42:11
117
原创 2021-TRN2-A
https://vjudge.net/contest/422763#problem/A 原题复制粘贴 这里有一个关于合法的括号序列的问题。 如果插入“+”和“1”到一个括号序列,我们能得到一个正确的数学表达式,我们就认为这个括号序列是合法的。例如,序列"(())()", “()“和”(()(()))“是合法的,但是”)(”, "(()“和”(()))("是不合法的。我们这有一种仅由“(”,“)”和“?”组成的括号序列,你必须将“?”替换成括号,从而得到一个合法的括号序列。 对于每个“?”,将它替换成“(”和
2021-02-28 18:57:03
115
原创 2021-TRN2-F
https://vjudge.net/contest/422763#problem/F 原题复制粘贴 n个人一起排队接水,第i个人的重要性是ai,需要bi的时间来接水。 1 <= n <= 100000 0 <= bi <= 1000 0 <= ai <= 1000 同时只能有一个人接水,正在接水的人和没有接水的人都需要等待。 完成接水的人会立刻消失,不会继续等待。 你可以决定所有人接水的顺序,并希望最小化所有人等待时间乘以自己的重要性ai的总和。 细节 题意,思路都不复
2021-02-26 23:36:12
102
原创 2021-TRN2-J
https://vjudge.net/contest/422763#problem/J 题意概括 二维平面上,有一种炸弹可以炸目标物,要么炸一行,要么炸一列。求按照给出的顺序,每个炸弹对应能够炸掉多少个目标。 思路 其实思路很简单,最大的问题是空间问题。 这里就要用到map+multiset了(玄妙) 好处是,不仅节省了空间(不用开超大数组或者超大vector),而且节省了时间(multiset插入删除都很快,综合下来强于vector),只是不太好想。。。 代码 #include <bits/stdc
2021-02-26 23:14:00
91
原创 2021-TRN3-G
https://vjudge.net/contest/424076#problem/G 题意概括 给出n个数,求这n个数能产生的C(N,2)个差的绝对值 ∣Xi - Xj∣ (1 ≤ i < j ≤ N)的中位数 思路 (暴力法不说了,超时了) 这题我们二分求答案。 二分的特点就是:我们先猜出一个答案:当然这个答案不一定是最终答案,这需要我们检验,然后不断逼近。 当然了,这么做的前提是,我们知道一定有符合题意的答案。 最难写的其实就是检验的函数。直接上代码了。 代码 #include <stdio.h
2021-02-25 17:06:15
103
原创 2021-TRN3-J
2021-TRN3-J https://vjudge.net/contest/424076#problem/J #include <bits/stdc++.h> using namespace std; const int maxn=1e5+5; struct node { int attack,defense; }a[maxn],b[maxn]; multiset<int>myset; multiset<int>::iterator it; int cmp1
2021-02-25 16:52:54
115
原创 初学树状数组(BIT)
初学树状数组(BIT) 菜鸟来学习树状数组了(耶) 还是从一个经典的问题引入吧 问题 对于一个长度为n的数列,有如下两种操作: 1.将元素ak加上x 2.查询任意一段区间的和。 (当然,两种操作都要进行多次) 在上面的问题中,其实只要能求到a1+a2+…的值,就可以解决问题了 为什么要有树状数组 (以下纯粹为个人意会,如有误,轻喷) 对于任意一个数字,我们都可以将其表示为2的幂次的和的形式,而且这种表示唯一。原因:任意一个十进制数都可以表示为唯一 一个二进制数。 比如,我们想求出a1+a2+…+a16 又
2021-01-23 22:55:13
127
原创 Hero(2021-TRN1-N)
Hero(2021-TRN1-N) 看破思路以后这题啥都不是,(于是就不附上代码好了) 题目大意 传送门 大意是说:面前有一群敌人,已知他们的血量和每次攻击的伤害,假设你血量无限,每一次攻击可以对一个敌人造成一点伤害,试求敌人对你的伤害的最小值。 (注意:你攻击一次的同时,所有的敌人会同时攻击你,伤害累加) 题目分析 都知道要贪心,关键是用什么去贪心。 (由于好久没打游戏了) 我一开始想的是:按照攻击力递减,攻击强的要先干掉,不然威胁巨大。 但是,很容易就举出反例(左边攻击,右边生命值) 4 1 5 5 2
2021-01-22 21:10:30
103
原创 Unique Snowflakes(2021-TRN1-M)
Unique Snowflakes(2021-TRN1-M) 打完此题查了一下,居然是uva的题目。。。 更没有想到这种题目有固定方法。。。看的书还是嫌少了。 题目大意 传送门 大意只有一句话:给你一个长度为n的数组,在里面找一个尽可能长的一段,使得这一段中所有数字都不同。 题目分析 我自己凭感觉探索出的思路居然和固定套路想法有亿点点相似(不完全同) 然而由于写的过于的拙劣,所以还是要分析学习一下固定套路~ 对于该类段查找问题可以采用经典的滑动窗口方法,即维护一个窗口,窗口的左右边界用两个变量L,R代表,
2021-01-22 20:37:48
142
原创 低买高卖(2021-TRN1-C)
低买高卖(2021-TRN1-C) (由于参考了题解就没有交~) 题目大意 传送门 考虑股票市场,一共有n天。 对于第i天,B君知道股票的价格是每单位ai元 在每一天,B君可以选择买入一个单位的股票,卖出一个单位的股票,或者什么都不做。 刚开始B君有无穷多的钱,但是没有任何股票。 问n天之后B君最多可以赚多少钱。 (1 <= n <= 200000) (1 <= ai <= 10000) (注意:一天不可以同时买同时卖) 题目分析 题解的意思大概如下: 比如说对于1 4 10这个序列
2021-01-21 21:06:17
511
1
原创 Flip Game(2021-TRN1-K)
Flip Game(2021-TRN1-K) 题目大意 传送门 这个和poj 1222有点类似(其实那道题更难一点) 大意是说,在一个4*4的棋盘上面(姑且称作棋盘)的每一个格子里都放着一个棋子。棋子比较特殊,一面是黑的,一面是白的。可以通过翻棋子来改变棋子的颜色。每翻一个棋子,这个棋子的颜色肯定变了,而该棋子周围的棋子也会随之变颜色。 求最少的步骤。 题目解析 典型的DFS,不需要太多的剪枝。这个论断的得出是因为DFS的本质是枚举。而显然,每一个棋子我们都可以选择翻开或者不翻开,一共就有2^16次方种可能
2021-01-21 20:40:13
156
原创 排座椅(2021-TRN1-H)
排座椅(2021-TRN1-H) 题目大意 传送门 大意是:一个教室里有几条横着的过道和竖着的过道(由你来确定位置),使得过道能够尽可能多的隔开较多的爱交头接耳的同学。爱交头接耳的同学都是成对的,要么在前后,要么在左右。 题目解析 本来不是难题,但是坑有点多。。。 主要还是眼瞎 第一个 每两个整数之间用空格隔开(行尾没有空格)。 第二个 其中 ai<ai+1(所以选出通道位置后还要一次排序) 代码 #include <bits/stdc++.h> using namespace
2021-01-21 20:13:30
142
原创 拼数(2021-TRN1-F)
拼数(2021-1-F) (感谢邓学姐指导本人走上写题解之路) 题目简述 设有 n 个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。 例如:n=3时,3个整数 13,312,343 联接成的最大整数为:34331213。 输入格式: 第一行,一个正整数 n。 第二行,n 个正整数。 输出格式: 一个正整数,表示最大的整数。 题目分析 解决编程问题常常忽视的一点,就是使用什么数据类型/数据结构。这是解决问题的第一步。 本题没有什么比较重要的数据结构,关键在于数据类型。 20个正整数排一起,肯定
2021-01-20 20:59:30
161
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人