- 博客(168)
- 收藏
- 关注
原创 1785:Binary Search Heap Construction
(对于一个结点,在结点左边的就是左子堆,右边就是右子堆,当然得是优先级更低的结点才包含进去)其中l和r数组是记录在该位置的左/右边最近的比他大的结点的位置。下半部分直接把结点的关系都给连上去,形成一个树。搞得我现在都不知道怎么改(因为不知道错哪)效率还行吧,时间空间复杂度都是O(n)build的上半部分就是搞这两个数组的。也不知道错哪里,也不给我错误的样例。顺带一提,这题的描述和shit一样。print函数直接打印就完了。
2024-08-10 12:16:26
250
原创 Power Calculus(UVA 1374)
简单来说就是每一次“位移”都是选择两个数进行加法或除法来得到新的数,初始的数组只有1,代表的是x^1。当最大的数乘2^(maxd - d)所得到的数小于n的时候剪枝。加法不是任选两个数,而是尽可能选更大的数。猜想:每次使用新得到的数。用的迭代加深搜索做的。只需要有一个数大于n。
2024-07-23 11:02:19
395
原创 1818:ATP
不难发现对于一个排名为val的人,他可以打赢[val - k, n]排名的人,我们从这里找是否有这样的人,如果有,则放进数组。从mid出发,找一个排名最小(或者说最高的)mid又可以打过的人,然后判mid赢。mid为假设的答案,如果mid可以,则l = mid,否则r = mid。再给每一个人找一个人,让他们能打赢,且在半决赛的时候判这两个人赢就行了。现在数组有两个人,如果总决赛只剩下这两个人,理论上mid就可以胜出。不难得出,找出的这个人,排名要尽可能的小(高),才有利于找到方案。
2024-07-19 17:07:27
275
原创 3872:Library
就是用快速幂加上斐波那契数列通项就行了,虽然f(2)= 2,但是设f(0)= 1就没差了。(斐波纳契数列的通项公式,把A^(n - 1)改成A^(n)就是本题的公式)就是n太大了,最高有十亿,不能用普通的dp来做。这玩意的dp公式应该很明显吧?经验丰富的可能已经知道了。和斐波纳契数列一个样。
2024-07-17 12:56:30
149
原创 1703:发现它,抓住它
测,这题差点让我去世用了一堆方法来做后面现学了并查集,用了并查集来做,因为缩短路径的方法不好,还是超时了后面换了一种缩短路径的方法先上代码。
2024-07-10 17:01:46
450
原创 Zombie‘s Treasure Chest(UVA - 12325)
求出S1和S2的最小公倍数LCM,即当二者的体积相同的时候,若宝物1的价值更大,则宝物2拿的数量不能超过LCM / S2,因为若超过,LCM大小的体积部分完全可以替换为宝物1,且价值更大。反之,可以推出宝物2的价值更大的情况。关键在于减少枚举量,若枚举宝物1的数量,则枚举量为N / S1;枚举宝物2的则是N / S2。这两代码的原理是一样的,就是第二个代码在转化的时候出问题了,害的我改了好久。根据这个原理,就可以写出代码了。
2024-07-09 16:17:35
153
原创 Editing a Book(UVA - 11212)
实际上我的代码还有一些地方可以优化,比如对同一个Node指针用shrink用了很多次,可以改成一次。这题我用迭代加深搜索(iterative deepening)来做的,今天刚学的这玩意,现学现用。顺带一提,虽然说是剪切之后粘贴,但是实际上一次剪切+一次粘贴 = 两个相邻的片段交换位置。我的Node结点把连成串的数字变成一个整体,这样在搜索的时候就不会让原来的链变得更乱了。当Node结点只有一个的时候,说明只有一个串了,答案出来了。因为h一次最大减少3个,所以可以根据这个剪枝。maxd:最大的搜索深度。
2024-07-08 19:37:13
164
原创 The Morning after Halloween(待优化)
说是可以换一个算法,比如双向广度优先搜索,但是我感觉这玩意对效率的提升并没有什么帮助(话虽如此,我也还没有尝试)同时,我已经根据给出的地图重新建立了一个图(就是那个G数组)来记录该点合法的移动方向,但是最后还是超时了。这题比较炸裂的一点在于,移动的点可以高达3个,一次可以延申出来的状态有5*5*5 = 125个。但是状态的记录倒是没多大问题,因为地图很小,纵使使用占用内存最大的哈希表也不会让内存爆炸。纵使题目表明有很多障碍,可以延申出来的状态也是很多。
2024-07-08 13:55:49
243
原创 Fill - UVA 10603
vis是记录目前状态下的最小的倒水量,下标分别代表a,b杯的水量,因为总水量不变,故不记录c杯的水量。感觉有点浮躁,没法完全将思绪投入题的思考中。我这代码的可读性……
2024-07-06 21:44:20
276
原创 2019:Cornfields
根据输入的数据不断更新这个矩阵就可以了,数据输入完,这个矩阵就是供查询的答案矩阵。但是注意到查询数K最大会有十万,所以我们不可能根据查询现查现算,很明显会TLE,除非你有一个方法可以瞬间得到子矩阵的最大值和最小值,我是没有想到啦。这是翻译过后的版本,题目要求我们帮助FJ找到放置玉米地的最佳位置,但实际上我们只需要根据给出的查询,来给出最大值和最小值的差值就行了。那转变一下思路,注意到B和N最大才250,我们只需要提前把答案设置好,供后面的查询就行了。唉,最近沉迷法环,都没怎么学习了。
2024-07-02 13:37:46
235
原创 1012:Joseph
从我的代码可以看出来,用了一个递归函数进行判断该m行不行,因为k小于13,所以递归层数最多到14个,不用担心栈堆段内存爆炸。简单来说就是保持队列的第一个是编号为1的好人,这样就可以直接取余得出要处决的人的编号,只需注意一下刚好整除的情况就行了。只想到了一个快速找到下一位处决的人的方法,本质上还是遍历,暂时没想到更优的方法了。r:在上次处决之后,处决的人的后面的坏人数(到第一个好人出现为止)num:这次要处决的编号。
2024-06-27 13:04:00
197
原创 笔记:记录状态并判重的方法
编号为1-8的8个正方形滑块被摆成3行3列(有一个格子留空),如下图所示每次可以把与空格相邻的滑块(有公共边才算相邻)一道空格中,而它原来的位置就成为了新的空格。给定初始局面和目标局面(用0表示空格),你的任务是计算出最少的移动步数。如果无法到达目标局面,则输出-1。
2024-06-24 11:55:34
321
原创 完成大作业后的总结(一点关于使用qt的总结)
byd,CSDN上消失了一个月,现在终于回归了中间跑去做大作业了(虽然中间水了两周),还有一堆破事,转专业,竞赛啥的嘛,这是最后的成果:外排序部分很快就写完了,后面的画图和gui设计搞了我好久(毕竟第一次接触)
2024-05-30 18:00:46
1177
3
原创 作用域为类的常量(C++)
另外,MONTH只是一个符号名称,在作用域为整个类的代码中遇到它时,编译器用12来替换它。那也是一种方法(算法上经常用),但是违反了OOP的精神(你在类外也可以调用MONTH,但是如果你本意如此,那我没话讲)这里创建了一个常量,这个常量将与其他静态变量储存在一起,而不是储存在对象中。总所周知,有一些常量在一些类中非常有用,比如Year类中12就可以用来表示月份数。这是因为这里只是类的声明,在一个类的对象被创建之前,12是没有地方可以放的。此外,这里的枚举没有提供枚举名,因为这里只把枚举当作常量。
2024-04-23 18:20:24
202
原创 函数指针的一点总结
这些函数特征标看似不同,实际上相同,因为在函数的参数列表中,指针=数组,而且原型中可以省略标识符(这里的是ar)要调用函数,就得认识到这样一点:既然pd指向数组,那么*pd就是数组,而(*pd)[i]就是数组中的元素。这两行中,前面的表示的是double指针的地址,后面的表示的是地址里面所代表的值。第一种调用方式是模仿普通函数的使用的,因为函数名就代表指针的地址,那指针也同理。(提示:[]的优先级高于*,所以[]先声明了pa是一个包含3个元素的数组)而[3]又表明他是一个指向含有三个(元素)的数组的指针。
2024-04-22 11:15:23
370
原创 P1030 [NOIP2001 普及组] 求先序排列
不过真的离谱,这次又出现我的答案和测试样例一模一样但是提交之后全部WA的情况了。之前在洛谷做题也出现过一样的问题,一道动态规划的题。思路和我之前在UVA做的一样,而且UVA那题更难。(我的代码是又臭又长啦,别骂了别骂了)
2024-04-21 17:45:43
244
原创 编程填空题:麻烦的位运算
可以看到,那个函数直接return了,也就是说,得找到一个表达式,直接求出结果。也就是说,找到n的第一个出现的0的位置,返回这个位置前面都为1的数字就可以了。这个就是用来找到找到n的第一个出现的0的位置,并且只有该位置为1的数。这题实际上是我上篇博客的主题,但是那篇博客不是用枚举子集的方法来做的。异或(^)运算符:A^B 计算出A与B的对称差集。与(&)运算符:A&B 计算出A和B的并集。或(|)运算符:A|B 计算出A和B的交集。按位取反(~)运算符:~A 计算出A的补集。假设n的二进制为:1011。
2024-04-18 12:45:02
317
原创 Mobile Computing(UVA 1354)
然后又遇上了储存的问题,因为传统二叉树是用数组或new或者内存池来使用内存的,这个的话,每次复制都要把上一层的根节点下面的“树枝”也全部复制,当时我就在烦恼怎么释放内存(现在倒是有思路了)。先想想从上到下构建二叉树的特点是什么,我想出来的就是:可以根据根节点得到已经组成的整个树,因此只需要在每次递归枚举的时候记下根节点的地址,而且在继续构建树的时候,只要在原有的树的基础上加上新的叶子结点就行了,而取消造成的变化只需要删除新的叶子结点就行了。不过说实话,我最后提交的时候给我的结果是WA。
2024-04-16 20:45:21
436
原创 #382. 工资计算系统(继承和派生)
当然算法学习也是得学的,还得学学Python,C++也得往前超个进度了。我看了一下下一个题,是关于二叉树组成的枚举的,没做过这种,找个时间整整。两个竞赛都搞完了(如果有进复赛的话,那还有),现在是要忙于转专业了。
2024-04-15 20:15:16
184
原创 #381. 四边形继承练习
代码还有可以改进的地方,像在求面积和周长的时候,可以用一个值记录,以及一个值记录是否判断过,避免重复判断。当然以上是老师给的原文件填上我的答案之后的,我填的地方有注释标注的,很明显。说实话第一次用继承,虽然上次有用过,但是没那么深入。甚至还现学了叉积判断线段是否相交和求面积的方法。
2024-04-15 13:30:48
241
原创 试题 C: 质因数个数
快三天都没刷题了,想着明天就蓝桥杯了,就找了个真题做了下。但是没有测试点给我用,所以我的代码不保证正确性。可以看得出来这题很简单。
2024-04-12 22:04:34
218
原创 Bandwidth(UVA 140)
这样就可以按照字典序遍历,只有遇到带宽更小的才复制,就不用考虑带宽相等时比较字典序的问题了。现在回想一下,我用的IDcache法好像不如用一个集合记录本次出现的结点来用。
2024-04-09 20:26:48
196
原创 Krypton Factor(UVA 129)
因为添加新字符之前的字串已经判断过了,所以只需要判断包含新字符的字串是否有相邻的重复字串就可以了。一道枚举题,用回溯法枚举。
2024-04-09 11:57:34
209
原创 子集生成的一些总结
对于每一个集合的位置,都用一个bool元素代表是否在集合中,因此是到n = cur的时候再输出集合。和位向量法差不多,用一个标准表示这个元素是否存在,然后进行枚举,不过这里用的是二进制。一次选出一个元素放到集合中,每一次递归都需要输出集合,因为是子集。对于给定的n,生成集合{1,2……
2024-04-08 21:29:02
248
原创 枚举排列的一些总结
这个数列又分为有重(有至少两个变量值一样)和无重(相当于集合)的。当然这个代码用了太多的全局变量,想要少用点可以用指针。会自动生成下一个序列,而当没有下一个序列的时候就结束。枚举排列,就是生成关于一个数列的所有排列。清明放假宅宿舍爽玩了4天,现在水个文发发。具体可以上网查查,这里就不赘述了。
2024-04-08 09:07:43
192
原创 Fractions Again?!(UVA 10976)
这个代码是我上农概课写的,电脑提醒没电的时候匆忙把EPS改成1e-4然后提交,提交结果没出来电脑就关机了,回到宿舍看了看才知道AC,真刺激。根据题目,y属于(k,k * 2],一一枚举y,然后计算出x,然后判断x是不是整数就行。我用的是floor和ceil函数,因为可以分清x是从下方还是上方接近整数的。顺带一提,EPS不能取太小,我之前取的是1e-6,最后导致一些x求不出来。
2024-04-02 19:57:48
180
原创 Maximum Product(UVA 11059)
不过话说回来,关于数字过大的题最近都没怎么做了,上学期刚开学的时候做得倒是挺多,算是给C语言入门的一道小坎子吧。简单枚举题,枚举就行,只是要注意数字太大导致“爆了”,用个long long int来记录。
2024-04-02 18:31:42
180
原创 Division(UVA 725)
考完CSP认证之后动力就有点不足,之后还有一个蓝桥杯,虽然说考的还行,混了个370,但是昨天一天都不怎么想敲代码。昨天中午倒是被老师的题卡了一个多小时,因为出了没教过的内容,关于类内的const static变量的初始化的方式。暴力枚举就行了,但是要分析之后再枚举,要不然会变得不幸。因为算是忙于算法的学习,导致对C++语法没时间自学。干完蓝桥杯我得去啃C++ Primer Plus了。
2024-04-02 11:04:34
230
原创 Petri Net Simulation(UVA 804)
一道模拟题,模拟Petri网,本来以为很简单的,结果第一次直接超时。然后我就优化了一下,使触发不是一次,而是一波。
2024-03-28 18:52:42
164
原创 Equilibrium Mobile(UVA 12166)
而对于同一个结点下降后虽然会分成多个结点,但是这些下降后的结点的值都是相等的,而改变所有这些下降后的结点(归属同一个原来的结点)的值,只需要改变一次原来的结点的值就行了,所以干脆把这些结点变成一个结点看待。使二叉树不同深度的地方全部降到最低深度,因为天平两边的杆相同,所以是每下降一层就除2。因为对于下降过后的结点,如果更改这个下降后的结点的值一次,就是更改原来的结点的值一次。我刚开始一直在想:这不是要尽可能地使相邻层的重量相差一倍嘛,但是这要怎么搞?虽然给的树都是正整数,但是修改的重量可以是浮点数。
2024-03-27 12:08:46
316
原创 一个关于用标准输入输出重定向进行debug的小技巧
总所周知,在我们刷oj题的时候,一般是用cmd终端进行输入输出的,输入和输出都显示在同一屏幕上,导致我们有时候对输出进行难以分析。后面我是成功得在相应文件里面得到了输出,然后和一万多行的标准输出文件比对了。但是我试了试,到处都找不到相应的文件,cmd终端上输出结果倒是没了。同时如果有标准答案文件,也可以进行文件比较,更容易发现出错的样例。所以我建议把文件的路径也写上去,并且在相应位置新建相应的文件。就像这个,我当时只用了输出的,所以这边只演示输出的。注意在字符串中 \\ 代表的是 ' \ '
2024-03-26 18:52:00
189
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人