![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法作业
记录一下做算法作业的过程
i_actor
一只学C++的菜鸡。
展开
-
算法复习 - 归并排序求解逆序数问题(分治)
题目描述:解析:本题使用归并排序来求解逆序对数的问题,交换元素的次数正好就等于逆序数的个数。代码:#include<iostream>#include<algorithm>#include<vector>#include<string>using std::cin;using std::cout;using std::endl;using std::vector;using std::string;void merge(vecto原创 2020-12-20 19:45:49 · 874 阅读 · 0 评论 -
算法复习 - 递归求解众数问题(分治)
题目描述:解析:通过分治,每次求解s[mid]的出现次数,然后统计。将s拆分成两个部分,然后再分别求解。代码:#include<iostream>#include<algorithm>#include<vector>using std::cin;using std::cout;using std::endl;using std::vector;void search(const vector<int>& s, int lo原创 2020-12-20 16:50:08 · 1403 阅读 · 0 评论 -
算法作业 - 最小半径的生成树
题目描述:解析:这道题要求半径最小,根据题目描述其实也就是高度最小,只需要用b遍历以每个节点为根节点的生成树,找到其中高度最小的就行了。代码:#include<iostream>#include<algorithm>#include<vector>#include<queue>#define MAX 101using namespace std;void bfs(vector<vector<int>>matrix,原创 2020-12-19 12:55:49 · 785 阅读 · 1 评论 -
算法作业 - 根据邻接表生成反向邻接表和邻接矩阵
题目:这道题就是一个简单的数据结构(邻接表)的遍历和生成,好像也没用到什么算法。#include<iostream>#include<algorithm>#include<vector>#include<string>using std::cin;using std::cout;using std::endl;using std::vector;using std::string;struct listnode{ int poi原创 2020-12-18 10:58:19 · 662 阅读 · 0 评论 -
算法作业 - 第一次课后作业(回文问题、幸运数问题、大数乘法问题、排序问题)文末附源码
第一题:本题要求最小的步数,我个人的看法就是比较low 和 high的大小 ,如果low = high low 和high各向中间前进一步。如果low<hign 将low的值加到low+1上,反之将high加到high-1上。第二题:这个题好像也没啥好说的,遍历判定就行了。第三题:这个题我个人的做法就是将乘法拆分成加法。第四题:这个题的基本做法就是直接排序比较就行了。实验全部代码:#include<iostream>#include<algorithm>#原创 2020-12-15 21:24:20 · 111 阅读 · 0 评论 -
算法作业 - 求解小易喜欢的数列问题(dp)
题目:这道题的状态转换比较简单,seq[i][j] += seq[i - 1][t];,但这样做的话会超时,主要是在计算k的时候是平方的复杂度了。最开始超时的代码:#include<iostream>#include<algorithm>#include<vector>#include<map>using std::cin;using std::cout;using std::endl;using std::vector;using s原创 2020-12-06 10:57:12 · 842 阅读 · 0 评论 -
算法作业 - 求解饼干问题(dp)
题目:刚看到这道题的时候,第一时间想到的是暴力,但是发现当X位数多起来后运算量太大,遂放弃。就考虑dp来求解,不过水平有限无法发现其状态转移方程,就参考了一下这位老哥的解法,发现很简单。分解饼干问题其主要方法就是通过不断求模取余数,保存余数的状态,状态转移方程为:dp[i][temp % n] += dp[i - 1][j]。代码如下:#include<iostream>#include<algorithm>#include<vector>#include&原创 2020-12-06 10:04:33 · 557 阅读 · 0 评论 -
算法作业 - 求解数字和为sum的方法数问题(dp)
题目:由于n的个数大于1000,所以很显然不能使用穷举的办法,只能使用dp来进行求解,我个人的做法就是用一个map来进行映射,这样比用数组相对来说会节省很多空间。把每一列值加上上一列的值,map的first保存值,second保存出现的次数。(等于sum时我直接开始统计,不用累加到后面)#include<iostream>#include<algorithm>#include<vector>#include<map>using std::cin原创 2020-12-04 14:00:44 · 1111 阅读 · 0 评论 -
算法作业-求解袋鼠过河问题(dp)
题目:本题是一个简单的dp问题,只需要知道表达式dp[i + j] = std::min(dp[i] + 1, dp[i + j]);就行了,这道题我唯一的迷惑就是不知道跳上第一个木桩算不算一次,这里涉及到dp[0]的取值。如果按照所给答案等于4来看的话,就算一次弹跳了。个人感觉这道题题意给得不够明确。#include<iostream>#include<algorithm>#include<vector>using std::cin;using std:原创 2020-12-04 12:20:20 · 1494 阅读 · 0 评论 -
算法作业 - 作业调度带惩罚问题(贪心)
本题我的大致思路就是先对每个作业按照提交时间和惩罚大小进行排序,然后依次填数,如果该位置未填充作业就直接填充进去,如果有作业就将里面的作业提出,将本作业填进去,并将提出的作业的deadline-1,重复此过程,知道deadline < 0.则该作业就是丢弃的作业。#include<iostream>#include<algorithm>#include<vector>#define max 201using std::cin;using std::.原创 2020-11-22 21:49:34 · 993 阅读 · 0 评论 -
算法作业 - 区间覆盖问题(贪心)
算法主要思想: 第一步将所有点进行排序,以方便计算距离。然后把所有区间间距排序,再连接间距最短的两个线段(间距大小并列的只连接一个),统计这时候有多少条线段,如果大于限制线段数就继续连接区间间距次小的两个区间…直到线段数等于规定最大线段数为止。#include<iostream>#include<algorithm>#include<vector>#define max 201using std::cin;using std::cout;using s.原创 2020-11-22 19:40:46 · 323 阅读 · 0 评论 -
算法作业-求解最大乘积问题(dp)
这道题要求时间复杂度为O(n),空间复杂度为O(1),因此用dp是最简单的做法。由于这道题存在负数,所以我在保存最大值时,也保存了最小值。#include<iostream>#include<algorithm>#include<vector>using std::cin;using std::cout;using std::endl;using std::string;using std::vector;int maxProduct(vector.原创 2020-11-21 15:21:50 · 1066 阅读 · 4 评论 -
算法作业-动物通信问题(回溯法)
这道题其实相对比较简单,直接暴力求解就行了。#include<iostream>#include<algorithm>#include<vector>using std::cin;using std::cout;using std::endl;using std::vector;void animalTrans(vector<vector<int>>& animal, int start, const int&.原创 2020-11-18 14:19:26 · 538 阅读 · 7 评论 -
算法作业-幸运的袋子数(回溯法)
这道题其实思路很简单,就是判断所有的组合中不重复的满足要求的袋子的个数,最大的难点就是不重复。因为可能包含相同的球,比如1 1 和 1 1就是重复的。我加用了一个vector来存储每个球出现的次数,每次可以选择1 - bucket[i]中的一个。#include<iostream>#include<algorithm>#include<vector>#include<stack>#define max 1001using std::cin;.原创 2020-11-18 13:38:43 · 701 阅读 · 0 评论 -
算法作业-最大团问题(回溯法)
本题最开始我以为是要用深度优先再加一个判断,写了半天发现题意理解错误。其实不停的循环判断该点和后面的点是否是一个团组中的就行了,将沿途中的点保存在Vector中,对每一个新的点进行判断:是否和前面所有的点属于同一个团中就行了。#include<iostream>#include<algorithm>#include<vector>#include<stack>using std::cin;using std::cout;using std::.原创 2020-11-17 19:46:33 · 2049 阅读 · 2 评论 -
算法作业-密码问题(回溯法)
本题题意比较简单,就是从给出的字符串中选出5个,使其代入所给公式的值等于n。感觉过程基本就是穷举。#include<iostream>#include<algorithm>#include<vector>using std::cin;using std::cout;using std::endl;using std::vector;using std::string;bool InResult(char c, vector<char>r.原创 2020-11-16 21:11:45 · 1000 阅读 · 0 评论 -
算法作业-供应商问题(回溯)
本题说是用回溯法,但是我感觉其实就是一个暴力加上减枝的算法,逻辑十分简单。#include<iostream>#include<algorithm>#include<vector>using std::cin;using std::cout;using std::endl;using std::vector;void minWeight(vector<vector<int>>& w, vector<vector&.原创 2020-11-16 19:35:15 · 441 阅读 · 0 评论