
pat
呆鱼敲代码
这个作者很懒,什么都没留下…
展开
-
1068 Find More Coins (01背包求具体方案)
思路:由于需要输出最小字典序,故我们可以先将物品从小到大排序,然后我们从后往前进行01背包的求解,求最大价值。如果所求的最大价值不等于m,则为No Solution。否则,我们将从体积为m进行从前往后的回溯,如果当前的体积为后一个物品的体积转移而来,则方案中必然选取了该物品,这时我们输出该物品的体积,并使体积减去该物品的体积。以此类推直到输出该方案的所有物品。题目大意:给定一组数字,选取若干个数,使其和为m,如果有多个解,输出字典序最小的解。原创 2023-11-27 16:58:19 · 421 阅读 · 0 评论 -
1072 Gas Station (最短路径同时求最短路,最长路,总路径)
思路:刚开始不知道未选中的加油站是否应该算入路径中,后面看了一下样例才知道未被选中的加油站的路也是可以使用的,所以我们可以将加油站也看作结点排在居所后面,然后再对每个加油站跑一遍最短路,同时找出最短路,最长路(计算是否在服务区内),总路径(算平均距离)。题意:给定几处居民住所与几处预选加油站点,求离最近的居民住所最远且所有居民都在该站点服务区内的加油站点,如果有多个,则选择平均距离最小的,再有多个,选择序号最小的。(debug弄了一个多小时,找坑点又半小时,做一题,一天又快没了)原创 2023-11-27 21:04:28 · 436 阅读 · 0 评论 -
1087 All Roads Lead to Rome(最短路求最大权值,最短路路径条数,节点个数,回溯路径)
【代码】1087 All Roads Lead to Rome(最短路求最大权值,最短路路径条数,节点个数,回溯路径)原创 2023-11-28 21:59:09 · 402 阅读 · 0 评论 -
1055 The World‘s Richest (有时候不要把问题想得太复杂)
总结教训:其实后面想想,这题的数据范围确实很难达到1e5*1e3,所以这题败在了计算数据范围上了,而且就算是1e5*1e3(1e5个人,1e3次查询,且每次查询都查不到),那也可以先尝试着写个暴力上去拿分的,也花不了多长时间,pat的题目大多其实还是友善的,有时候暴力甚至都能拿不少分。思路:原先看见数据范围,1e5*1e3,嗯,这题肯定不只是排序那么简单,于是优化又优化,把stl的功能尝试了个遍,各种排序,又绞尽脑汁地想二分等等等等费劲心思去优化掉一个复杂度,,最后放弃。原创 2023-11-26 13:02:16 · 382 阅读 · 0 评论 -
1059 Prime Factors (筛质数)
答案是输出1就行啦,想不到吧。又浪费半个小时,pat是这样的。考考你的阅读理解:你猜猜如果输入为1,应该输出什么?原创 2023-11-26 18:34:45 · 388 阅读 · 0 评论 -
1089 Insert or Merge (插入排序,相邻归并排序,附模拟实现)
比如:初始为1 2 3 4 3,目标数组也为1 2 3 4 3,则如果是从头开始推的,则下一步会变成1 2 3 4 3,而下一步应该是 1 2 3 3 4。所以我们应该从第一个无序的位置开始排序。也就是从最后一个3开始排序判断目标数组。注意点2:题目中的归并排序为相邻归并(递推归并),而非中分归并(递归归并)。注意点1:判断插入排序不能从头开始判断是否为目标数组,技巧点:排序可以用sort减少思考步骤。原创 2023-11-29 16:57:49 · 556 阅读 · 0 评论 -
1067 Sort with Swap(0, i)
每次交换的最优操作为将0与本该在此位置的数交换位置,如果0已经在0位置了,那么就先与其他未归位的数进行交换(即先将其他未归位的数放在0位置,由于0最后一定会归位回到0位置,所以该数最后也一定会归位),然后再进行一轮归位。注意点:判断是否排序好的复杂度太大,所以我们可以采用枚举每个数字是否归位的方式去进行每一轮的归位操作。题意:给定一组排列,只能用0去与其他数字交换位置,求将其排序好所需要的步骤数。原创 2023-11-27 14:57:17 · 422 阅读 · 0 评论 -
1057 Stack(multiset)
题目大意:给定一个栈的操作序列,push,pop,peekmedian,其中peekmedian为获取栈的中值。方法一:stack维护普通的查询,multiset维护前半段与后半段,则中值为前段的末尾值。(好难受,又花一个小时写一题,没想出来,看的题解。也不知道到时候考试能拿多少分,唉。方法二:树状数组,维护每个数的出现次数,再二分查找中间数字即可。原创 2023-11-26 17:09:54 · 403 阅读 · 0 评论 -
1064 Complete Binary Search Tree (构建完全二叉搜索树)
首先,我们考虑满二叉树,结点数为:2^n-1(n为层数),那么如果我们将完全二叉树补满,则需要的结点数设为sub,sub可求,那么我们可以知道完全二叉树的最后一层结点的分布情况。将最后一层的结点分成所属左右子树两部分,则左子树的整棵树结点数可以求出设为num,则在中序遍历中前面的num个结点都所属左子树,则第num+1个结点就是根结点,然后以此类推,写一个递归就行了。简而言之就是:已知完全二叉树的结点数,求左子树的结点数num,则根为第num+1个结点。题目大意:给定一些结点,构建完全二叉搜索树。原创 2023-11-26 21:24:07 · 445 阅读 · 0 评论 -
1056 Mice and Rice
坑点:每个选手的rank为该轮竞赛选出的优胜者数+1!而不应该根据该选手是在第几轮淘汰算的!因为肯定比优胜者的rank低嘛。思路:可以用队列模拟选手顺序,每次取出组数个选手(不足则全部取出),然后将优胜者放入下一轮队列中,淘汰者记录下来,最后将淘汰者的rank标记为优胜者数+1。题意:给定一组选手,按一定顺序将这些选手进行分组竞赛,每组的最大值为优胜者,进入下一轮分组再进行竞赛,直到选出最大值。然后输出每个选手的rank。(成功浪费两小时寿命,坑比模拟题,真的心累)原创 2023-11-26 15:44:49 · 567 阅读 · 0 评论 -
1071 Speech Patterns (巧用字符流逃课)
(为什么说是阅读理解题?初看题目与样例,我还以为只需要判定引号里面的单词才行,于是写一堆边界判定,一交,嘎,就过一个测试点。一直改一直找是哪出了问题,改了一个多小时,放弃了,看别人写地代码,哦,不用管引号,啪得一下把乱七八糟的判定什么的全删了,直接过了,还更简单了,服,pat真就比谁的脑洞大呗)我有一计,可以很方便地将单词分割出来:我们可以将除了数字与英文字母的所有其他字符替换成空格,并且将字符全换成小写,然后将处理后的字符串传入stringstream字符流中,这样就可以一个单词一个单词地读取了。原创 2023-11-27 18:42:47 · 444 阅读 · 0 评论 -
1098 Insertion or Heap Sort (插入排序,堆排序,附模拟代码)
堆排序思想:简单来讲就是通过一种方法(模拟堆的思想),将数组的第一个位置一直维护为整个待排序数组的最大值。然后依次将第一个位置与最后一个位置交换位置(因为最后一个位置需要存放最大值嘛,而最大值我们已经维护在了第一个位置),再将待排序数组缩小(因为最后一个位置已经排好序了,我们就不需要管最后一个位置了),然后重新更新最大值(即维护第一个位置的最大值)。而在初始建树时,我们需要从底层开始建树,因为down操作只能将小值下沉,而不能直接使大值上浮。依次往下递推,将小值“沉”下去,原创 2023-11-30 13:21:27 · 518 阅读 · 0 评论 -
1076 Forwards on Weibo (链接表层序遍历)
思路:将关注的粉丝用链接表存储,再对博主进行层序遍历,遍历L+1层(因为不能包含博主层),并且将遍历过的人都标记防止重复计算,同时算出所有遍历到的所有结点。结点数-1(不包含博主)即为答案。原创 2023-11-28 12:10:53 · 660 阅读 · 0 评论 -
1078 Hashing (哈希表,平方探测法)
平方探测法:当哈希表插入时遇到冲突,正常来讲我们应该查询下一个位置,直到查询到空位置则插入(线性探测法),但是如果这样做的话容易使数据聚集,于是我们改成依次查询(p+0^2),p+1^2,p+2^2,p+3^2,,,p+(m-1)^2(m为哈希表的容量)每次移动平方个单位,寻找下一个插入的结点(平方探测法),这样就不容易聚集了。(这也是为什么容量最好是素数的原因,如果是素数,则不会重复查询结点,即会查询到更多的位置,减少数据插入不了的情况。输出每个数的插入的位置,如果无法插入,则输出"-"。原创 2023-11-28 16:10:57 · 597 阅读 · 0 评论 -
1091 Acute Stroke (三维搜索)
题目可能看起来很难的样子,题目意思大概是:给你一个L*M*N的01长方体,求全为1的连通块的总体积大小。(连通块体积大于T才计算在内)思路:直接搜索每个为1的点,计算连通块大小即可。原创 2023-11-29 17:59:22 · 558 阅读 · 0 评论 -
1021 Deepest Root (层序遍历解法)
首先任选一个结点进行,层序遍历求最后一层的结点,然后再将最后一层的结点再分别作为根结点,求他们对应的最后一层的结点,对这些所有的“最后一层的结点”去重排序就是答案了。题意:给定一个图,求以哪些结点为根,能够得到最深的树。原创 2023-11-23 21:52:00 · 439 阅读 · 0 评论 -
1038 Recover the Smallest Number(自定义排序)
思路:对比两个字符串a,b,将这两个字符串尝试拼接起来成ab与ba,如果ab原创 2023-11-24 20:29:32 · 421 阅读 · 0 评论 -
1052 Linked List Sorting (巨坑题)
题意:以address,val,next_address的形式给定一个链表,同时给定头节点的address,求将该链表排序后的形式。坑点二:没想到吧,给定的链表还可能为空!这种情况下,我们只需要输出0与头结点就行了。坑点一:有的结点不在该链表上,需要遍历一遍链表排除掉。(可以用哈希表存储链表)pat拿分简单,但是拿要高分确实难。原创 2023-11-25 21:38:38 · 824 阅读 · 0 评论 -
1047 Student List for Course (不让用string?我就用!快速输入挂,string)
(不但用string,我还用map,主打的就是不想动脑子,不过用set的话就真会超时了)(不过其实不用快速输入,改用cin也就慢100多毫秒)原创 2023-11-25 17:28:00 · 362 阅读 · 0 评论 -
1043 Is It a Binary Search Tree (二叉搜索树建树,性质)
既然给定了二叉搜索树的所有结点,那第一反应可能会是先将这些结点构建成一个二叉搜索树(正好学到了二叉搜索树的建树)。最直接的解法,也是我最开始的写法,存在很多注意点,问题很多,不太推荐。按理应该能过,但是我最后还是放弃了这种解法。(碎碎念:一直拿不到满分,尝试了多种解法,最后挑了一个最常规的解法去一直debug才满分通过了,,这题花费了快4个小时了,,哭死)涉及到二叉搜索树的一个性质:即二叉搜索树的中序遍历为所有结点的从小到大(镜像为从大到小)的排序。题意:给定一个二叉树的前序遍历,判断是否为二叉搜索树。原创 2023-11-25 14:12:34 · 446 阅读 · 0 评论 -
1044 Shopping in Mars (双指针)
思路:双指针,左指针遍历数组的同时,右指针向右移动,右指针找到大于等于m的最小的位置,即:找到getSum(i,j)>=m的第一个位置,并将其值与左右指针记录下来。最后输出最小的值与左右指针即可。题意:给定一个数组,求其中子串和大于等于m的最小子串和,并输出该子串首尾pos。原创 2023-11-25 15:32:09 · 363 阅读 · 0 评论 -
1040 Longest Symmetric String(暴力回文串)
思路:由于数据量较少,可以直接暴力解决(能够优化到十几毫秒)。二重循环枚举首尾相等的字符串,判断是否为回文串,更新最大值即可。题意:给定一个字符串,求连续最长回文串。原创 2023-11-24 21:35:02 · 392 阅读 · 0 评论 -
1030 Travel Plan (求最短路路径,记录父结点)
dijks求最小路径,当更新最小值时,如果dist[j]>dist[u]+e[u,j],则更新dist[j]=dist[u]+e[u][j],sum[j]=sum[u]+w[u][j],p[j]=u;如果dist[j]==dist[u]+e[u,j],则看最小花费,如果sum[j]>sum[u]+w[u][j],则sum[j]=sum[u]+w[u][j],p[j]=u;题目大意:给定一个图,图的每条边有长度与花费,求从终点到起点的最小路径,如果有多个最小路径,则输出花费最小的那一个。原创 2023-11-24 13:14:22 · 376 阅读 · 0 评论 -
1051 Pop Sequence (判断是否为合理出入栈顺序)
注意点:栈要清空,不过很遗憾,stack好像没有clear函数,要么一个一个弹出(耗时),要么就每次重新定义一个stack(耗空间)。还有就是判断为不合理后不能直接break,因为还要完整的读取后面的数。当前数未入过栈:先将该数及所有之前未入栈的数入栈,判断栈的容量是否超过最大容量,如果没有超过,则pop(),否则,不是合理顺序。当前数入过栈:如果栈顶不是该数,则不是合理顺序,如果是,则pop()思路:使用一个栈模拟栈出入过程,temp记录当前入过栈的数。原创 2023-11-25 20:53:18 · 400 阅读 · 0 评论 -
1045 Favorite Color Stripe (动态规划)
dp[i]表示前i个数中,选取第i个数所能够得到的最长的数组(如果第i个数不在给定的集合中则pass),我们只需要记录顺序集合每个数的最后出现的位置(其实也就是记录该数的最大值出现的位置),遍历给定的顺序集合同时更新最大值,即:dp[i]=max(dp[i],dp[finalpos[k]]),直到遇见该数就break。(今天遇到的第一道会的题,花费半个小时,如果考试的30分题也能这么容易想出来就好了)题意:给定一组数的顺序,在数组中找到最长的且符合该顺序的子串。原创 2023-11-25 16:18:43 · 366 阅读 · 0 评论 -
1020 Tree Traversals(已知后序中序,求先序)
题意:已知后序(postorder)与中序遍历(inorder),求先序遍历(preorder)可以看看我的这篇文章,三种遍历求法都整理好了。原创 2023-11-23 20:07:43 · 395 阅读 · 0 评论