自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(173)
  • 收藏
  • 关注

原创 Cubic Eight-Puzzle(UVA-1604)

(第三方网站)AC了!本来以为会TLE的因为当时已经把我能想到的优化方法都加上去了,可是对于深度有30及以上的样例,在我的电脑上运行也是需要差不多一秒的但是上交之后只花了380ms,AC了。

2024-09-19 20:03:19 762

原创 Egyptian Fractions (HARD version)(UVA 12558)

因为后面枚举的分数都不会比1/i大了,且剩下的分数个数为maxd + 1 - d,在最好情况下(就是都等于1/i),剩余分数的总和如果不能比aa/bb大,就没必要继续了,直接剪枝,又因为实际上分数不能相等,所以应该加一个等于号。然后我就按照印象中的思路开始写,结果直接裂了,把循环结束条件按习惯写成剪枝条件,分析了一会,加了个全局变量改改,感觉还是不行,回过头去看源代码才知道自己有多唐。总的来说就是用迭代加深搜索,因为有用到剪枝的方法,实际上是IDA*就加了个限制条件:有k个数字不能用。

2024-09-14 12:40:22 332

原创 Pipeline Scheduling(UVA 690)

这题还是有点折磨的,刚开始我只会递归下一个程序运行的时间(范围在1~n),很明显,直接TLE,然后用C++STL里面的bitset容器来表示所有的程序运行状况(因为最差情况下最长的时间段是200,用longlong只有64位,不够表示),结果vjudge上直接表示Compile Error,应该是不能用。其中,把时间段200缩短到20的方法启发了我,而且里面提到的jump数组也减少的了递归量。按这个思路自己写了一下之后是AC了。

2024-09-12 21:16:42 338

原创 Firetruck (UVA 208)

反正你得按字典序从小到大打印无向图中从起点到终点的起点,所以你所能做的就是用递归来遍历打印,没啥好优化的。其中加上了提前判断能否到达终点的函数(因为算法书中表示不这么做会超时)注意火灾发生在消防站的情况就行了(就是火灾发生地点为1)其中sort函数的使用其实没什么必要,可以删去。一道简单递归题(康复训练)

2024-09-10 15:36:54 198

原创 2181:Jumping Cows

简单来说,题目要求我们求出一个子串,在奇数位的数加,偶数位的数减,求总的最大值。在波峰的时候加,波谷的时候减。(这是我拿去翻译的版本)

2024-09-03 18:08:45 156

原创 2766:最大子矩阵

这个是把内存压下来的代码,dp公式一样,只不过看起来比较复杂。虽然内存爆了,但是这个更容易看懂。

2024-08-14 13:51:15 182

原创 1785:Binary Search Heap Construction

(对于一个结点,在结点左边的就是左子堆,右边就是右子堆,当然得是优先级更低的结点才包含进去)其中l和r数组是记录在该位置的左/右边最近的比他大的结点的位置。下半部分直接把结点的关系都给连上去,形成一个树。搞得我现在都不知道怎么改(因为不知道错哪)效率还行吧,时间空间复杂度都是O(n)build的上半部分就是搞这两个数组的。也不知道错哪里,也不给我错误的样例。顺带一提,这题的描述和shit一样。print函数直接打印就完了。

2024-08-10 12:16:26 260

原创 2814:拨钟问题

每个行为的次数不超过3,因为当次数为4的时候,相当于没动。

2024-08-07 18:57:27 166

原创 Power Calculus(UVA 1374)

简单来说就是每一次“位移”都是选择两个数进行加法或除法来得到新的数,初始的数组只有1,代表的是x^1。当最大的数乘2^(maxd - d)所得到的数小于n的时候剪枝。加法不是任选两个数,而是尽可能选更大的数。猜想:每次使用新得到的数。用的迭代加深搜索做的。只需要有一个数大于n。

2024-07-23 11:02:19 403

原创 2818:密码

后面改成直接对单独循环节长度进行计算,毕竟最小公倍数可能很大。关键在于对循环节的长度的计算。

2024-07-20 17:06:21 214

原创 1818:ATP

不难发现对于一个排名为val的人,他可以打赢[val - k, n]排名的人,我们从这里找是否有这样的人,如果有,则放进数组。从mid出发,找一个排名最小(或者说最高的)mid又可以打过的人,然后判mid赢。mid为假设的答案,如果mid可以,则l = mid,否则r = mid。再给每一个人找一个人,让他们能打赢,且在半决赛的时候判这两个人赢就行了。现在数组有两个人,如果总决赛只剩下这两个人,理论上mid就可以胜出。不难得出,找出的这个人,排名要尽可能的小(高),才有利于找到方案。

2024-07-19 17:07:27 284

原创 3872:Library

就是用快速幂加上斐波那契数列通项就行了,虽然f(2)= 2,但是设f(0)= 1就没差了。(斐波纳契数列的通项公式,把A^(n - 1)改成A^(n)就是本题的公式)就是n太大了,最高有十亿,不能用普通的dp来做。这玩意的dp公式应该很明显吧?经验丰富的可能已经知道了。和斐波纳契数列一个样。

2024-07-17 12:56:30 155

原创 1703:发现它,抓住它

测,这题差点让我去世用了一堆方法来做后面现学了并查集,用了并查集来做,因为缩短路径的方法不好,还是超时了后面换了一种缩短路径的方法先上代码。

2024-07-10 17:01:46 458

原创 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 161

原创 练手:用数组构建链表

之前都是看别人用这个方法,自己都没有试过,敲代码这种东西,自己写过才会印象深刻所以我自己想了个题来练手。

2024-07-09 09:34:27 158

原创 Editing a Book(UVA - 11212)

实际上我的代码还有一些地方可以优化,比如对同一个Node指针用shrink用了很多次,可以改成一次。这题我用迭代加深搜索(iterative deepening)来做的,今天刚学的这玩意,现学现用。顺带一提,虽然说是剪切之后粘贴,但是实际上一次剪切+一次粘贴 = 两个相邻的片段交换位置。我的Node结点把连成串的数字变成一个整体,这样在搜索的时候就不会让原来的链变得更乱了。当Node结点只有一个的时候,说明只有一个串了,答案出来了。因为h一次最大减少3个,所以可以根据这个剪枝。maxd:最大的搜索深度。

2024-07-08 19:37:13 171

原创 The Morning after Halloween(待优化)

说是可以换一个算法,比如双向广度优先搜索,但是我感觉这玩意对效率的提升并没有什么帮助(话虽如此,我也还没有尝试)同时,我已经根据给出的地图重新建立了一个图(就是那个G数组)来记录该点合法的移动方向,但是最后还是超时了。这题比较炸裂的一点在于,移动的点可以高达3个,一次可以延申出来的状态有5*5*5 = 125个。但是状态的记录倒是没多大问题,因为地图很小,纵使使用占用内存最大的哈希表也不会让内存爆炸。纵使题目表明有很多障碍,可以延申出来的状态也是很多。

2024-07-08 13:55:49 252

原创 Fill - UVA 10603

vis是记录目前状态下的最小的倒水量,下标分别代表a,b杯的水量,因为总水量不变,故不记录c杯的水量。感觉有点浮躁,没法完全将思绪投入题的思考中。我这代码的可读性……

2024-07-06 21:44:20 283

原创 2229:Sumsets

这题不是我想出来的在这里仅做记录。

2024-07-06 17:10:35 349

原创 2019:Cornfields

根据输入的数据不断更新这个矩阵就可以了,数据输入完,这个矩阵就是供查询的答案矩阵。但是注意到查询数K最大会有十万,所以我们不可能根据查询现查现算,很明显会TLE,除非你有一个方法可以瞬间得到子矩阵的最大值和最小值,我是没有想到啦。这是翻译过后的版本,题目要求我们帮助FJ找到放置玉米地的最佳位置,但实际上我们只需要根据给出的查询,来给出最大值和最小值的差值就行了。那转变一下思路,注意到B和N最大才250,我们只需要提前把答案设置好,供后面的查询就行了。唉,最近沉迷法环,都没怎么学习了。

2024-07-02 13:37:46 242

原创 1012:Joseph

从我的代码可以看出来,用了一个递归函数进行判断该m行不行,因为k小于13,所以递归层数最多到14个,不用担心栈堆段内存爆炸。简单来说就是保持队列的第一个是编号为1的好人,这样就可以直接取余得出要处决的人的编号,只需注意一下刚好整除的情况就行了。只想到了一个快速找到下一位处决的人的方法,本质上还是遍历,暂时没想到更优的方法了。r:在上次处决之后,处决的人的后面的坏人数(到第一个好人出现为止)num:这次要处决的编号。

2024-06-27 13:04:00 200

原创 P7771 【模板】欧拉路径

忘掉了输出欧拉回路的方法,搞了我好久。

2024-06-24 17:51:27 289

原创 笔记:记录状态并判重的方法

编号为1-8的8个正方形滑块被摆成3行3列(有一个格子留空),如下图所示每次可以把与空格相邻的滑块(有公共边才算相邻)一道空格中,而它原来的位置就成为了新的空格。给定初始局面和目标局面(用0表示空格),你的任务是计算出最少的移动步数。如果无法到达目标局面,则输出-1。

2024-06-24 11:55:34 325

原创 完成大作业后的总结(一点关于使用qt的总结)

byd,CSDN上消失了一个月,现在终于回归了中间跑去做大作业了(虽然中间水了两周),还有一堆破事,转专业,竞赛啥的嘛,这是最后的成果:外排序部分很快就写完了,后面的画图和gui设计搞了我好久(毕竟第一次接触)

2024-05-30 18:00:46 1201 3

原创 作用域为类的常量(C++)

另外,MONTH只是一个符号名称,在作用域为整个类的代码中遇到它时,编译器用12来替换它。那也是一种方法(算法上经常用),但是违反了OOP的精神(你在类外也可以调用MONTH,但是如果你本意如此,那我没话讲)这里创建了一个常量,这个常量将与其他静态变量储存在一起,而不是储存在对象中。总所周知,有一些常量在一些类中非常有用,比如Year类中12就可以用来表示月份数。这是因为这里只是类的声明,在一个类的对象被创建之前,12是没有地方可以放的。此外,这里的枚举没有提供枚举名,因为这里只把枚举当作常量。

2024-04-23 18:20:24 211

原创 函数指针的一点总结

这些函数特征标看似不同,实际上相同,因为在函数的参数列表中,指针=数组,而且原型中可以省略标识符(这里的是ar)要调用函数,就得认识到这样一点:既然pd指向数组,那么*pd就是数组,而(*pd)[i]就是数组中的元素。这两行中,前面的表示的是double指针的地址,后面的表示的是地址里面所代表的值。第一种调用方式是模仿普通函数的使用的,因为函数名就代表指针的地址,那指针也同理。(提示:[]的优先级高于*,所以[]先声明了pa是一个包含3个元素的数组)而[3]又表明他是一个指向含有三个(元素)的数组的指针。

2024-04-22 11:15:23 377

原创 P1030 [NOIP2001 普及组] 求先序排列

不过真的离谱,这次又出现我的答案和测试样例一模一样但是提交之后全部WA的情况了。之前在洛谷做题也出现过一样的问题,一道动态规划的题。思路和我之前在UVA做的一样,而且UVA那题更难。(我的代码是又臭又长啦,别骂了别骂了)

2024-04-21 17:45:43 247

原创 P1036 [NOIP2002 普及组] 选数

上次的枚举子集构建二叉树的那个在写这题的过程中又有了新思路。下午就要英语口语考试了。

2024-04-19 11:42:26 242

原创 编程填空题:麻烦的位运算

可以看到,那个函数直接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 320

原创 Mobile Computing(UVA 1354)

然后又遇上了储存的问题,因为传统二叉树是用数组或new或者内存池来使用内存的,这个的话,每次复制都要把上一层的根节点下面的“树枝”也全部复制,当时我就在烦恼怎么释放内存(现在倒是有思路了)。先想想从上到下构建二叉树的特点是什么,我想出来的就是:可以根据根节点得到已经组成的整个树,因此只需要在每次递归枚举的时候记下根节点的地址,而且在继续构建树的时候,只要在原有的树的基础上加上新的叶子结点就行了,而取消造成的变化只需要删除新的叶子结点就行了。不过说实话,我最后提交的时候给我的结果是WA。

2024-04-16 20:45:21 442

原创 #382. 工资计算系统(继承和派生)

当然算法学习也是得学的,还得学学Python,C++也得往前超个进度了。我看了一下下一个题,是关于二叉树组成的枚举的,没做过这种,找个时间整整。两个竞赛都搞完了(如果有进复赛的话,那还有),现在是要忙于转专业了。

2024-04-15 20:15:16 188

原创 #381. 四边形继承练习

代码还有可以改进的地方,像在求面积和周长的时候,可以用一个值记录,以及一个值记录是否判断过,避免重复判断。当然以上是老师给的原文件填上我的答案之后的,我填的地方有注释标注的,很明显。说实话第一次用继承,虽然上次有用过,但是没那么深入。甚至还现学了叉积判断线段是否相交和求面积的方法。

2024-04-15 13:30:48 244

原创 试题 C: 质因数个数

快三天都没刷题了,想着明天就蓝桥杯了,就找了个真题做了下。但是没有测试点给我用,所以我的代码不保证正确性。可以看得出来这题很简单。

2024-04-12 22:04:34 223

原创 Bandwidth(UVA 140)

这样就可以按照字典序遍历,只有遇到带宽更小的才复制,就不用考虑带宽相等时比较字典序的问题了。现在回想一下,我用的IDcache法好像不如用一个集合记录本次出现的结点来用。

2024-04-09 20:26:48 199

原创 Krypton Factor(UVA 129)

因为添加新字符之前的字串已经判断过了,所以只需要判断包含新字符的字串是否有相邻的重复字串就可以了。一道枚举题,用回溯法枚举。

2024-04-09 11:57:34 215

原创 Prime Ring Problem(UVA 524)

没想到之前一直刷的这种题会出现在算法书上。我是先找出可能得到的素数然后进行枚举的。

2024-04-08 22:21:45 237

原创 子集生成的一些总结

对于每一个集合的位置,都用一个bool元素代表是否在集合中,因此是到n = cur的时候再输出集合。和位向量法差不多,用一个标准表示这个元素是否存在,然后进行枚举,不过这里用的是二进制。一次选出一个元素放到集合中,每一次递归都需要输出集合,因为是子集。对于给定的n,生成集合{1,2……

2024-04-08 21:29:02 263

原创 枚举排列的一些总结

这个数列又分为有重(有至少两个变量值一样)和无重(相当于集合)的。当然这个代码用了太多的全局变量,想要少用点可以用指针。会自动生成下一个序列,而当没有下一个序列的时候就结束。枚举排列,就是生成关于一个数列的所有排列。清明放假宅宿舍爽玩了4天,现在水个文发发。具体可以上网查查,这里就不赘述了。

2024-04-08 09:07:43 199

原创 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 184

原创 Maximum Product(UVA 11059)

不过话说回来,关于数字过大的题最近都没怎么做了,上学期刚开学的时候做得倒是挺多,算是给C语言入门的一道小坎子吧。简单枚举题,枚举就行,只是要注意数字太大导致“爆了”,用个long long int来记录。

2024-04-02 18:31:42 182

xiangguanlunwen

关于本题的论文

2023-12-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除