
算法练习
Roswellii
https://roswellii.github.io/
展开
-
leetcode_跳跃游戏
你是一颗棋子。你总是担心你到不了彼岸。每走一步,你都会好奇,这一次,你是不是拥有了更远的距离。然而有时候,你甚至都迈不出下一步。有,你就赢了;一直没有,你就输了。class Solution {public: bool canJump(vector<int>& nums) { int maxr= 0; int n= nums.size(); for(int i=0; i<=maxr; i原创 2022-02-28 21:22:30 · 2647 阅读 · 0 评论 -
2021-10-01 PTA1002 写出这个数
题目:读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。思路:切割字符串-求每位到‘0’的距离- 计算和- 提取和的每一位数字- 查表输出配音#include<bits/stdc++.h>using namespace std;string pingyin[10]={"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};vector<int> outseq;int main(原创 2021-10-01 01:19:51 · 120 阅读 · 0 评论 -
PTA 7-1 寻找大富翁 (25分) 第三个数据点
第三个数据点到底有些什么?这样是不行的;这样就行了(saveN保存了输入的富翁个数)看来问题是输入的M也许会大于N。原创 2020-12-05 17:08:35 · 381 阅读 · 0 评论 -
二叉搜索树练习——利用BST实现一个城市数据库
其实这是实验课的作业,写起来才发现学了两个月数据结构写树都不流畅——不过代码量还是挺大的。【注意,以下的代码是跑不了的】这里只是个框架,我添加了很多注释,希望能够方便大家启迪思路;作业的话还是多查查资料,自己动手吧。#include<iostream>#include<string>using namespace std;class node {public: string cityName; int x; int y; node* left; n.原创 2020-11-03 19:51:42 · 849 阅读 · 0 评论 -
PTA7-2 星际探险 负权的最短路径与SPFA算法
我们开着飞船从一个星球飞到另一个星球,我们想找到一条能量消耗最低的路线。题目中,花费的能量用负数表示,而吸收的能量是正值。这可不好办,因为我们隐隐感觉这是一道最短路径的问题,但是消耗都是负数该怎么办?那就在输入的时候取反吧,这样消耗成了一个正数,而我们要做的就是使得一条路径消耗加起来最小,就可以套用最短路径算法了。特别注意题目中的“不为永动机”这个细节条件,这就可以理解成不会出现“负回路", 因为经过取反后,如果我们走了一圈消耗的能量为(-x),那么就相当于得到了(x)的能量,就造出了永动机。.原创 2020-11-01 16:08:31 · 497 阅读 · 0 评论 -
7-1 任务调度的合理性
这道题就是个最基本的拓扑排序,然后需要指出子任务的意思是依靠当前任务的任务。比如说第三行输入2 1 2, 指的是任务1和任务2需要依赖于任务3。 (我觉得应该这样理解吧?原创 2020-10-25 17:25:32 · 345 阅读 · 0 评论 -
USACO 1.3.1 混合牛奶 JAVA TreeMap 解决超时问题
你可能会觉得这道题的超时是树引起的,如果你的代码只有一般的建树和遍历操作,那么事实上树很无辜。问题在于Scanner.请参考这篇文章解决Java在OJ时运行超时的问题-AdamLeeXi ,这里详细地介绍了Scanner和BufferedReader的时间效率上的区别(相差很大)。课上讲的有些记不清了,不过基本上的逻辑是,你需要用一个StringTokenizer来接BufferedReader.readLine()的结果,而StringTokenizer可以被转换成String型,之后再用把.原创 2020-10-16 18:04:11 · 238 阅读 · 0 评论 -
7-2 是否完全二叉搜索树 (树 层序遍历 队列)
如果遇到了一个不为二度的结点,那么如果这棵树时完全树则这个结点后面必须全部是叶子。有特别的情况,当这棵树只有两个结点时,根必然度数小于2,另一个结点必然是叶子,但这棵树也不是完全树。所以当结点数大于2时可以用通用的方法处理,而结点只有两个时最好作为特殊情况直接输出。至于层序遍历,可以使用队列。访问一个结点时,把它的左子放入队尾,再将右子放入队尾。上面一层的结点在队列中一定在下面一层的前面,并且从左向右排。代码包括了树的建立,队列的使用,层序输出。在层序输出的函数里,顺便用两个boo.原创 2020-10-10 13:51:13 · 336 阅读 · 0 评论 -
USACO 1.2.5 Dual Palindromes双重回文数 JAVA
和上一道1.2.4非常相似。整体思路并不困难,你要做的就是先保存好输入的数据记作n和S, 然后n是用来计数的,可以后面再去管它;而S用来标记讨论的起点,你可以在一个for循环用到它。现在要做的就是写for循环了,看题目要求,for循环需要从S+1开始一个一个数字讨论过去,对于每个数字你还需要检查一下看看它的能不能在两个进制下呈现回文特性,所以你可能需要建立个sign之类的布尔变量做标记,第一次改变sign并continue中止,第二次输出并计数。package doublePalindromic.原创 2020-10-08 11:37:45 · 180 阅读 · 0 评论 -
USACO 1.2.4 palindromicSquares回文平方数 JAVA
用JAVA做算法题时应该与用C++写不一样些。对于这题来说,你可以用到的JAVA特性有:Integer的静态函数toString(int i, int radix) 它可以很方便地帮你进行进制的转化。灵活使用StringBuffer和String:先利用前者的.reverse()再利用.toSting(), 可以很方便地进行回文性质的比较。值得注意的一点是,Integer的toString大于十的数字生成的是小写,你需要用.toUpperCase()再进行一次转化。import j.原创 2020-10-08 11:11:36 · 230 阅读 · 0 评论 -
6-12 二叉搜索树的操作集 sample 运行时错误 /VS2019提示未加载wntdll
你可以先检查一下是否出现了内存管理操作上的问题,比如再删除了一次一个已经被删除了的指针。它可能不是很明显,在一个不起眼的地方已经被删除了。总得来说,这就是问题的根源。在DEV里调试没有出现问题,但是鉴于PTA上始终无法通过我只能不情愿地把代码拷到VS2019里看看。这是最初寻找错误前的代码。#include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct TNode *Po.原创 2020-10-08 00:18:02 · 1174 阅读 · 0 评论 -
USACO 1.2.3删除排序数组中的重复项 JAVA
题目很短 其实解也很方便;这也是一道如果你刚开始刷题会不知道怎么办,需要你保持耐心认真看看资料做一做的题。看一看条件,数组是排好序的,可以很方便地得到解。我想不过是个输出长度嘛,所以我单纯地统计了数组里不同数字的长度,没有执行任何删除操作,在PTA上也过了。处于尊重的角度,我在输出答案后再进行了象征性地删除,用-1表示。package delDulplicate;import java.util.Scanner;//输入数据到数组//输入的数据本来就是排好序的//如果当前位和前.原创 2020-10-05 17:29:55 · 153 阅读 · 0 评论 -
USACO 1.2.2 方块转换 JAVA
这不是一道困难的题目,当然如果你之前没有什么做题也许会遇到一些问题,不过保持耐心你就可以搞定这道题了。同样,这也是我第二次写这道题了,几个月前我用C++写得有些凌乱,这次我想用JAVA写得优雅一些。首先你要输入数据:记录下大小,保存转前和转后的矩阵。接下来你要做的只是验证转后与转前每个元素的坐标符合什么样的关系就行了。仅此而已。package judgeSquareTrans;import java.util.Scanner;//输入数据// 输入大小// 存入before/.原创 2020-10-04 15:34:09 · 239 阅读 · 0 评论 -
USACO 1.2.1 Milking Cows 挤牛奶 (80分)
总之:为了节约时间,我开了很多数组来保存一些要用到的量,大概是把导入的时间翻来覆去地处理,那时我隐隐约约感觉到这埋下了不安定的因素。我测试了很久,始终有四个数据点过不了,最后我用测试数据一试,果不其然是数组开得不够大。我设置了两个全局变量分别控制时间数组的最大限度和农民人数的最大限度,而在修改程序的过程中我怎么可能还记得MAXN和MAXT的区别?对于这道题,我想我们可以先从最简单的思路入手,再不断调整,让程序可以处理各种特殊情况。假设有这么一张时间表,每一个时刻的状态都有数字表示:有人工作时记.原创 2020-09-26 12:01:57 · 364 阅读 · 0 评论 -
7-4 1.1.4 破碎的项链(USACO)
这将是这里第一道用Java解的题目。大概在两个月前,暑假实训的时候就已经用c++做过这题了。记得当时一点一点修改漏洞打补丁,搞得整个代码完全不可读;后来调整了思路,整体设计了解决方案,就好多了。记得当时印象最深刻的一个问题是:(可以简化为)如何确保一段由01组成的数字串,全是0或者全是1?有两种方案,第一种是在遍历过程中不断比较i和i-1位是不是一样的,另一种是只比较第i位和第0位是不是一样的。对于这一道题来说,第二种方案方便多了。这道题大概是说拿到一个字串,在一个地方打开,向左最深可.原创 2020-09-22 21:15:15 · 665 阅读 · 0 评论 -
计算器:中缀转后缀与后缀的计算
分别写了中缀转后缀,用后缀进行计算的两个源文件,后来想着干脆把它们连起来做个计算器吧。两个栈的声明完全可以合成一个类模板,不过既然复制粘贴很方便,就没去修改。而且这样一个是数组栈,而另一个是链表栈,也挺好的。写中缀转换栈的函数时遇到了些问题,主要是在左括号的处理上。不妨写几个中缀表达式做测试,这样可以更好地理解原理。简单来说,两个模块可以归成以下的思路。(参考了洛谷的题解)#include<iostream>#include<string>#define MAX_N 10原创 2020-09-16 15:05:08 · 633 阅读 · 2 评论 -
6-3 尾部循环的单链表
正是老师上课讲的关于“一只兔子撞到猎人粗壮的大腿上”的问题:一个本来不循环的单链表,当我们把它的tail上的NULL指针改成指向链表中的某一结点时,这张单链表就会在一部分结点上产生循环,就像这样:我们可以先试着把循环部分的长度求出来,然后再想办法把循环部分最靠前的结点给定位出来(也就是题目要求的)。相遇时,兔子走的结点数-乌龟走的结点数= 循环体覆盖的结点数...原创 2020-09-12 17:24:36 · 984 阅读 · 1 评论