- 博客(40)
- 收藏
- 关注
原创 洛谷 P1334 合并果子变形
https://www.luogu.com.cn/problem/P1334思路上来就想着,从大到小排序一下,然后每次砍掉最大长度的那一段,不就ok了吗?码之,WA了。不出意料仔细一想,切割的时候可以从中间切开,迅速缩小长度,每次砍掉最大长度看来并不是最优解。每次选一根木棒砍成两段,所消耗能量是两段木棒的长度和。我们用逆向思维:每次选两根木棒拼在一起,使得长度和最小,这样能量也就达到最小。这就是一个合并果子的变形而已。。。直接就优先队列冲了。代码#include <bits/stdc++.
2021-05-19 21:12:04 225
原创 CodeForces - 670C
https://vjudge.net/problem/CodeForces-670C对于我这个新手,此题略难。(话说这个不是离散化+二分吗,怎么被划入排序了)题目概括一群科学家挑选电影看。每个科学家只会一种语言(用序号表示)。一部电影有两种语言:音频语言与文字语言。问选取那部电影可以使得看懂音频语言的科学家最多。(若同样多,则选取使得看懂文字语言的科学家最多的电影)思路首先,我们必须知道每一种语言掌握的人数是多少。显然,桶排序是一个不错的选择。可惜,给的区间范围是[1,1e9]。所以要离散化。
2021-04-19 20:44:27 255
原创 hdu 3092 0/1背包+数论
https://vjudge.net/problem/HDU-3092题目概括给出两个数字n,m,求n的所有划分里划分出的数字的最小公倍数的最大值ans,输出ans%m。注意,ans可以很大很大很大。思路借鉴了https://blog.csdn.net/xuejye/article/details/80274052首先说一下设计算法求最小公倍数的最大值。最小公倍数要最大,我们希望划分里面要多出现素数。因为全部素数对于最小公倍数的贡献最大(全部乘在一起)标准格式是:n=p1^k1 * p2^k
2021-04-14 23:23:07 132
原创 hdu 2955 0/1背包/概率dp
https://vjudge.net/problem/HDU-2955题意概括给出小偷偷各家银行被抓的概率和所获得的钱数,给出允许被抓的最小概率值p(挺怪的),试问在被抓概率不超过p时,所能偷到的最多钱数。思路先搬出大佬的思路,可供参考~~https://blog.csdn.net/a1097304791/article/details/835867690/1背包这个不难想,但是很容易把概率当做背包容积,钱数当做dp值,其实有两个问题:1.概率是小数。当然,你可以乘上10^n倍,就算解决了吧。
2021-04-14 23:07:27 134
原创 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 142
原创 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 137
原创 poj 1061 拓展欧几里得+同余方程
题目概括https://vjudge.net/problem/POJ-1061简单来说,两只青蛙逆时针在一个长度为L的环上跳,给出青蛙的初始位置x,y和一次跳的长度m,n,问是否能够相遇思路https://blog.csdn.net/qq_41280600/article/details/103036453这位大佬写的很简洁,我也是借鉴了他的思路。这道题,我们首先要列一个二元一次方程。设两个同向而行的青蛙在t时间后相遇,那么两者的路程差一定是L的倍数。所以有:x+mt-(y+nt)=kL;
2021-04-08 21:10:32 97
原创 hdu 3117 斐波那契数列+矩阵快速幂
题目概括求第n个斐波那契数。这个n可以很大(10^8)。输出的时候,如果数字不足9位,则输出该数字;否则输出该数字的头四位和尾四位。思路参考了这位大佬的输出前四位部分(不是一般的尴尬)https://blog.csdn.net/qq_45034708/article/details/107790982好吧,先说说前四位。我们可以直接用下面这个公式感谢百度怎么用呢?因为当n很大,后面那项直接忽略,前面那项又太大了,所以我们取一个对数(log10),用double存起来。然后,这个数的小数部分取
2021-04-07 21:51:45 163
原创 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 85
原创 用十字链表实现矩阵加法
题目复制粘贴感谢https://blog.csdn.net/npuyan/article/details/80464459?spm=1001.2014.3001.5501这位代码写的很好细节创建十字链表并不是非常难。我借鉴了这位(https://blog.csdn.net/zhuyi2654715/article/details/6729783)的写法,写的很清楚,但是不能实现同一处连续插入两次的操作。最难的还是加法。我们假设把B加到A上面,那么,就存在添加新结点,不加不减(做加法未得到0),删
2021-04-01 21:04:51 1349
原创 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 113
原创 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 146
原创 用循环队列求解k阶斐波那契数列
题目大意感谢https://blog.csdn.net/LanXiu_/article/details/107118571思路这个题目很巧妙,说实话也开了眼界。(虽然明明可以用数组,而且数组有更快的算法)首先是初始化的问题。k阶不一定是二阶,所以在一个容量为k的循环队列(实际上要开容量到k+1,以便判队列满,不过这不重要,因为可以不判 )中,我们先压进去k-1个0,再压进去一个1,这就完成了初始化。然后就是循环,细节也很多,看代码吧。代码#include <iostream>#
2021-03-24 21:58:42 1564
原创 用数学方法求高精度pi
题意用双向循环链表为存储结构解决高进度pi问题。pi值要精确到第几位,就输出到第几位。思路首先给出我们计算pi的理论依据行了,从这个结构上就可以看出来,要有两个链表,一个存放一项的值(不断迭代),一个存放这些项的和(也不断迭代)当然链表的每一个节点存放一个数位。其实用数组也是可以的。既然是精度很高,那么肯定是要手动加减乘除了。居然调了好几次才把这加减乘除搞定代码细节挺多,不一一说了。//高精度计算PI#include <stdio.h>#include <stdl
2021-03-23 22:41:50 379
原创 2021-bfsTRN-K
https://vjudge.net/contest/425322#problem/K原题复制粘贴可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表
2021-03-22 00:31:21 97
原创 数据结构之多项式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 140
原创 2021-bfsTRN-J
https://vjudge.net/contest/425322#problem/J题目概括给定容积的三个杯子倒可乐(必须倒到一个杯子没有可乐或者一个杯子装满),问能否平分。思路很像数学题(他确实是),为什么和bfs有关呢?因为三个杯子的可乐体积代表了一个状态。状态数有限,所以可以bfs。每次拓展时,分六种情况讨论是那个杯子里的可乐倒到那个杯子里面去,这题就搞定了。(代码好长)(数学做法不会,有空学~~)代码#include <stdio.h>#include <st
2021-03-14 20:09:02 107
原创 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 194
原创 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 78
原创 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 105
原创 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 130 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 132
原创 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 104
原创 2021-dfsTRN-G
https://vjudge.net/contest/425321#problem/G题意概括在一个网格中给定出发点和终点,给定用的步数,试问能否恰好在该步数内走到终点。细节剪枝。好坑。(其实还是打的题目太少)最需要认识到的问题是:无论走什么路线,到达终点用的步数的奇偶性与(横坐标偏量+纵坐标偏量)相同。这样就可以排除掉一些可能性了。。。代码#include <stdio.h>#include <string.h>#include <iostream>
2021-03-05 19:43:17 86
原创 2021-dfsTRN-D
https://vjudge.net/contest/425321#problem/D原题复制粘贴在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。思路很像八皇后问题,所以我们还是一行一行的枚举,用col记录某一列有没有被占用就好。但是呢,一开始有个细节没顾及到。摆放的棋子个数可以小于棋盘大小n,所以完全可以某一行不放棋子。要小心。代码#incl
2021-03-03 20:50:37 139 1
原创 2021-dfsTRN-B
https://vjudge.net/contest/425321#problem/B题意概括给一串单调不增的数字,用这些数字凑出一个整数。经典的凑数字问题。但是比较麻烦的是输出,需要输出所有的可能情况,并且不能有重复。思路如何做到不重复呢?方法是,在dfs的时候,记录下已经选到的数字的下标。我们首先要保证选到的数字的下标是单调递增的。其次,因为一串数字可能会有重复的,所以当我们一次dfs搜完后,我们要剔除重复的数字。具体方法见下。代码#include <stdio.h>#in
2021-03-03 20:06:27 145 2
原创 2021-TRN1-Q
https://vjudge.net/contest/418600#problem/Q题意概括在x轴上,一只青蛙在0点处,一次最多可以跳L格,要跳到m。但是青蛙途中跳到的点只能是“特定点”。原来已经给出了一些特定点的位置,现在你可以在数轴上面任意放一些特定点。求青蛙跳的最多的次数。细节参考了https://blog.csdn.net/yeyeyeguoguo/article/details/44244569总体思路不难。很容易发现,取一个L+1的区间,最多要跳两次。所以我们就是要在数轴上找有多少个
2021-03-01 21:12:21 99
原创 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 108
原创 2021-TRN2-A
https://vjudge.net/contest/422763#problem/A原题复制粘贴这里有一个关于合法的括号序列的问题。如果插入“+”和“1”到一个括号序列,我们能得到一个正确的数学表达式,我们就认为这个括号序列是合法的。例如,序列"(())()", “()“和”(()(()))“是合法的,但是”)(”, "(()“和”(()))("是不合法的。我们这有一种仅由“(”,“)”和“?”组成的括号序列,你必须将“?”替换成括号,从而得到一个合法的括号序列。对于每个“?”,将它替换成“(”和
2021-02-28 18:57:03 106
原创 2021-TRN2-F
https://vjudge.net/contest/422763#problem/F原题复制粘贴n个人一起排队接水,第i个人的重要性是ai,需要bi的时间来接水。1 <= n <= 1000000 <= bi <= 10000 <= ai <= 1000同时只能有一个人接水,正在接水的人和没有接水的人都需要等待。完成接水的人会立刻消失,不会继续等待。你可以决定所有人接水的顺序,并希望最小化所有人等待时间乘以自己的重要性ai的总和。细节题意,思路都不复
2021-02-26 23:36:12 90
原创 2021-TRN2-J
https://vjudge.net/contest/422763#problem/J题意概括二维平面上,有一种炸弹可以炸目标物,要么炸一行,要么炸一列。求按照给出的顺序,每个炸弹对应能够炸掉多少个目标。思路其实思路很简单,最大的问题是空间问题。这里就要用到map+multiset了(玄妙)好处是,不仅节省了空间(不用开超大数组或者超大vector),而且节省了时间(multiset插入删除都很快,综合下来强于vector),只是不太好想。。。代码#include <bits/stdc
2021-02-26 23:14:00 84
原创 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 96
原创 2021-TRN3-J
2021-TRN3-Jhttps://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 110
原创 初学树状数组(BIT)
初学树状数组(BIT)菜鸟来学习树状数组了(耶)还是从一个经典的问题引入吧问题对于一个长度为n的数列,有如下两种操作:1.将元素ak加上x2.查询任意一段区间的和。(当然,两种操作都要进行多次)在上面的问题中,其实只要能求到a1+a2+…的值,就可以解决问题了为什么要有树状数组(以下纯粹为个人意会,如有误,轻喷)对于任意一个数字,我们都可以将其表示为2的幂次的和的形式,而且这种表示唯一。原因:任意一个十进制数都可以表示为唯一 一个二进制数。比如,我们想求出a1+a2+…+a16又
2021-01-23 22:55:13 110
原创 Hero(2021-TRN1-N)
Hero(2021-TRN1-N)看破思路以后这题啥都不是,(于是就不附上代码好了)题目大意传送门大意是说:面前有一群敌人,已知他们的血量和每次攻击的伤害,假设你血量无限,每一次攻击可以对一个敌人造成一点伤害,试求敌人对你的伤害的最小值。(注意:你攻击一次的同时,所有的敌人会同时攻击你,伤害累加)题目分析都知道要贪心,关键是用什么去贪心。(由于好久没打游戏了) 我一开始想的是:按照攻击力递减,攻击强的要先干掉,不然威胁巨大。但是,很容易就举出反例(左边攻击,右边生命值)4 15 52
2021-01-22 21:10:30 98
原创 Unique Snowflakes(2021-TRN1-M)
Unique Snowflakes(2021-TRN1-M)打完此题查了一下,居然是uva的题目。。。更没有想到这种题目有固定方法。。。看的书还是嫌少了。题目大意传送门大意只有一句话:给你一个长度为n的数组,在里面找一个尽可能长的一段,使得这一段中所有数字都不同。题目分析我自己凭感觉探索出的思路居然和固定套路想法有亿点点相似(不完全同)然而由于写的过于的拙劣,所以还是要分析学习一下固定套路~对于该类段查找问题可以采用经典的滑动窗口方法,即维护一个窗口,窗口的左右边界用两个变量L,R代表,
2021-01-22 20:37:48 126
原创 低买高卖(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 472 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 147
原创 排座椅(2021-TRN1-H)
排座椅(2021-TRN1-H)题目大意传送门大意是:一个教室里有几条横着的过道和竖着的过道(由你来确定位置),使得过道能够尽可能多的隔开较多的爱交头接耳的同学。爱交头接耳的同学都是成对的,要么在前后,要么在左右。题目解析本来不是难题,但是坑有点多。。。主要还是眼瞎第一个每两个整数之间用空格隔开(行尾没有空格)。第二个其中 ai<ai+1(所以选出通道位置后还要一次排序)代码#include <bits/stdc++.h>using namespace
2021-01-21 20:13:30 129
原创 拼数(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 148
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人