算法锻炼|认识各类型的算法思维
文章平均质量分 52
不要让这也成为你的遗憾.
怪&
让我们一起从菜鸟开始……
展开
-
【回溯与分支限界法】最优调度问题
问题描述:假设有n个任务由k个可并行工作的机器来完成。完成任务i需要时间为ti,设计完成这n个任务的最佳调度算法,使得完成全部任务的时间最早。编程任务:对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1,2,…,n。编程计算完成这n个任务的最佳调度。输入样例:(第一行为任务数n,第二行为可并行工作的机器数k,第三行为机器完成任务i所需的单位时间)10767 45 80 32 59...原创 2021-11-23 23:32:33 · 2233 阅读 · 1 评论 -
【回溯与分支限界法】运动员最优匹配问题
一、题目如下:问题描述:羽毛球队有男女运动员各n 人。给定2 个n×n 矩阵P 和Q。P[i][j]是男运动员i 和女运动员j配对组成混合双打的男运动员竞赛优势;Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势。由于技术配合和心理状态等各种因素影响,P[i][j]不一定等于Q[j][i]。男运动员i和女运动员j配对组成混合双打的男女双方竞赛优势为P[i][j]*Q[j][i]。设计一个算法,对于给定的男女运动员竞赛优势,计算男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。原创 2021-12-22 22:00:00 · 2120 阅读 · 1 评论 -
【贪心法】分数背包问题
一、问题如下:给出n个大小为s1, s2,... , sn,价值为v1 ,v2,...,vn的物品,并设背包容量为C。试设计一个贪心算法,找到非负实数x1,x2,…xn使和(从1到n求和),在约束(从1到n求和)<=C下最大。二、算法思想:求解思路:1、先求出各个物品的价值与体积的比value_v(注意浮点数强制类型转换)2、依据value_v排序。3、优先存入此值大的物品。4、若剩余空间不足存入整个物品,则按剩余空间存入部分即可。(即此题与01背包问题区别是原创 2021-11-30 23:18:33 · 4894 阅读 · 0 评论 -
【贪心法】会场安排问题
问题描述: 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的 。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)编程任务: 对于给定的k 个待安排的活动,编程计算使用最少会场的时间表。数据输入: (由文件input.txt 给出输入数据。如有此要求,将代码第11、12行注释结束即可)第一行有1 个正整数k,表示有k 个待安排的活动。接下来的k.原创 2021-11-04 18:55:38 · 508 阅读 · 0 评论 -
【贪心法】最优分解问题
题目描述:问题描述: 设n 是一个正整数。现在要求将n 分解为若干个互不相同的自然数的和,且使这些自然数的乘积最大。编程任务: 对于给定的正整数n,编程计算最优分解方案。数据输入: (由文件input.txt 提供输入数据。)文件的第1 行是正整数n。结果输出: 程序运行结束时,将计算出的最大乘积输出(到文件output.txt 中)。输入文件示例 输出文件示例input.txt output.txt10...原创 2021-11-04 20:16:01 · 3465 阅读 · 4 评论 -
【贪心法】程序存储问题
题目描述:设有n个程序{1,2,…, n }要存放在长度为L 的磁带上。程序i存放在磁带上的长度是li,1≤i≤n 。程序存储问题要求确定这n个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。编程任务: 对于给定的n 个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数。数据输入: (由文件input.txt 给出输入数据。)第一行是2个正整数,分别表示文件个数n 和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。结果输出:原创 2021-11-04 19:07:02 · 2873 阅读 · 2 评论 -
【回溯法】子集合问题
【问题描述】子集和问题的一个实例为<S,M>。其中S={x1,x2,…,xn}是一个正整数的集合,M是一个正整数。找出S的所有子集S1,使得S1中所有元素的和为M。试设计一个解子集和问题的回溯法。【样例输入】5 10 12 13 15 1830【样例输出】5 10 155 12 1312 18【样例说明】输入第一行是集合S,第二行是整数M;输出每一行代表一个解原创 2021-11-30 23:43:28 · 2117 阅读 · 0 评论 -
【动态规划法】0-1背包问题
问题如下:问题描述:给定n个重量为wi,价值为vi的物品(i=1,2,…,n),以及一个重量为W的背包,找出其中最有价值的物品子集,并且能全部放入背包中。输入样例:(第一行是背包重量上限,第二、三、四、五行是物品的重量和价值)107 423 124 405 25输出样例:(能够放入背包的物品最大价值)65代码如下:#include <iostream>#include <algorithm>//max()函数头文件 #..原创 2021-11-23 23:22:37 · 1356 阅读 · 0 评论 -
【动态规划法】硬币找零问题
给定 n 种不同面值的硬币,分别记为 c[0], c[1], c[2], … c[n],假设每种硬币的数量是无限的。同时还有一个总金额 k,编写一个动态规划计算出最少需要几枚硬币凑出这个金额 k?【样例输入】121 2 5【样例输出】3【样例说明】输入第一行为金额总数,第二行为硬币的不同面值;输出为需要的最少硬币数原创 2021-12-02 23:37:08 · 2857 阅读 · 3 评论 -
【分治法】整数因子分解问题
问题描述:问题描述: 大于1 的正整数n 可以分解为:n=x1*x2*…*xm。例如,当n=12 时,共有8 种不同的分解式:12=12;12=6*2;12=4*3;12=3*4;12=3*2*2;12=2*6;12=2*3*2;12=2*2*3 。编程任务: 对于给定的正整数n,编程计算n 共有多少种不同的分解式。数据输入: 由文件input.txt 给出输入数据。第一行有1 个正整数n (1≤n≤2000000000)。结果输出:原创 2021-11-08 23:06:22 · 1823 阅读 · 0 评论 -
【分治法】输油管道问题
问题描述:问题描述: 某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n 口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置, 即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在线性时间内确定主管道的最优位置。编程任务: 给定n 口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。数据输入: 由文件input.tx原创 2021-11-08 23:04:04 · 800 阅读 · 0 评论 -
【分治法】邮局选址问题
题目描述:邮局选址问题问题描述: 在一个按照东西和南北方向划分成规整街区的城市里,n 个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y 坐标表示南北向。各居民点的位置可以由坐标(x,y) 表示。街区中任意2 点(x1,y1) 和(x2,y2) 之间的距离可以用数值|x1-x2|+|y1-y2| 度量。居民们希望在城市中选择建立邮局的最佳位置,使n 个居民点到邮局的距离总和最小。编程任务: 给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。数据输原创 2021-11-08 22:57:00 · 3501 阅读 · 1 评论 -
【分治法】典型题目示例、含详细注释
一、众数问题:1. 众数问题 问题描述: 给定含有n 个元素的多重集合S,每个元素在S 中出现的次数称为该元素的重数。多重集S 中重数最大的元素称为众数。 例如,S={1,2,2,2,3,5}。 多重集S 的众数是2,其重数为3。 编程任务: 对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。 数据输入: 输入数据由文件名为inp.原创 2021-11-01 20:17:29 · 2321 阅读 · 0 评论 -
【分治法】集合划分问题
题目描述:问题描述: n 个元素的集合{1,2,., n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2, 3,4}可以划分为15 个不同的非空子集如下:{{1},{2},{3},{4}},{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4},{2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{1},{2}},{{1,2},{3,4}},{{1,3},{2,4}},{{1,原创 2021-11-08 23:00:51 · 1078 阅读 · 0 评论 -
【分治法】众数问题
题目描述:1. 众数问题问题描述: 给定含有n 个元素的多重集合S,每个元素在S 中出现的次数称为该元素的重数。多重集S 中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S 的众数是2,其重数为3。编程任务: 对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。数据输入: 输入数据由文件名为input.txt 的文本文件提供。文件的第1 行多重集S 中元素个数n;接下来的n 行中,每行有一个自然数。结果输出: ...原创 2021-11-08 22:52:47 · 916 阅读 · 0 评论 -
【分治法】第k个数(快速选择算法,结合快速排序)
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。输出格式输出一个整数,表示数列的第 k 小数。数据范围1≤n≤100000,1≤k≤n输入样例:5 32 4 1 5 3输出样例:3原创 2022-10-02 16:17:05 · 858 阅读 · 2 评论 -
判断数字是否是质数
#include using namespace std;int main (){ int n;cin>>n; for(int i=1;i>x; int flag=1; for(int j=2;j*j原创 2022-08-08 20:23:39 · 167 阅读 · 0 评论 -
【分治法】归并排序
思想分治法,分两段(已排好序的),然后依次将两段相对较小的值放入辅助数组递归穷尽两段后,将辅助数组覆盖至此区间对应的原数组#include using namespace std;const int N =1e5+10;int a[N];int b[N];//辅助数组int n;void merge_sort(int q[],int l,int r) {//递归思想 if(l>=r) return ;//区间最多一个值,跳出 int mid=l原创 2022-10-05 18:21:05 · 191 阅读 · 4 评论 -
打印菱形(奇数n阶实心)
输入一个奇数 n,输出一个由 * 构成的 n 阶实心菱形。代码#include using namespace std;int main(){ int n;cin>>n; for(int i=1;i原创 2022-08-08 19:45:39 · 874 阅读 · 0 评论 -
最长公共字符串后缀
给出若干个字符串,输出这些字符串的最长公共后缀。#include using namespace std;string s[210];int n;int main(){ while(cin>>n,n){//输入0结束 int len=999999;//记录最短字符串长度 for(int i=0;i>s[i]; //输入n个字符串 int len1=s[i].len...原创 2022-08-14 10:26:16 · 241 阅读 · 0 评论 -
输入一行字符串将其中的单词替换成另一单词
输入一个字符串,以回车结束(字符串长度不超过 100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。方法1:用ssin串流//可以getline(cin,str) 直接读入一行#include #include using namespace std;string x[100000];int main(){ string str,a,b; ...原创 2022-08-13 15:56:26 · 860 阅读 · 0 评论 -
【分治法】逆序对的数量(结合归并排序,含详细思想、解法、代码及注释)
题目给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 ia[j],则其为一个逆序对;否则不是。输入格式第一行包含整数 n,表示数列的长度。第二行包含 n 个整数,表示整个数列。输出格式输出一个整数,表示逆序对的个数。数据范围1≤n≤100000,数列中的元素的取值范围 [1,109]。输入样例:62 3 4 5 6 1输出样例:5思想:算法:分治法排序:结合归并原创 2022-10-06 19:42:55 · 642 阅读 · 0 评论 -
求字符串中最长的连续出现的字符
求一个字符串中最长的连续出现的字符,输出该字符及其出现次数,字符串中无空白字符(空格、回车和 tab),如果这样的字符不止一个,则输出第一个。#include #include using namespace std;string s;int n;int main(){ cin>>n; for(int i=0;i>s; int len=s.length(); cha...原创 2022-08-13 15:39:41 · 335 阅读 · 0 评论 -
求解最大公约数(两种)
解法1:递归思路代码解法2:1、暴力从1开始除以,能整除以即得到最大公因数2、从两者最小值开始除以,能整除即得到最大公因数原创 2022-08-17 12:05:55 · 662 阅读 · 0 评论 -
高精度加法
思想1、用string输入,用vector转存2、用t作为进位3、最后逆序输出代码#include #include using namespace std;vector add(vector &A,vector &B){ vectorC; int t=0;//记录求和值即进位 for(int i=0;i原创 2022-10-07 16:49:45 · 873 阅读 · 8 评论 -
判断N个数是否是完全数
解析c++1s中内,大概可以计算1亿次,已超时,所以需要优化。1不是完全数假设数为x,a为其约数,则x/a也为其约数, 因为 a * (x/a) = x假设约数中较小的那方为a,则a最大为x1/2所以我们只需从2开始遍历其前x1/2(含x1/2)的数即可,记得先将sum+1,因为1也算入约数因为x最大为108,开根号后为104,100个数需106...原创 2022-08-08 20:18:08 · 245 阅读 · 0 评论 -
字符串最大跨距
有三个字符串 S,S1,S2,其中,S 长度不超过 300,S1 和 S2 的长度不超过 10。现在,我们想要检测 S1 和 S2 是否同时在 S 中出现,且 S1 位于 S2 的左边,并在 S 中互不交叉(即,S1 的右边界点在 S2 的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2 的起始点与最左边的 S1 的终止点之间的字符数目)。如果没有满足条件的 S1,S2 存在,则输出 −1。例如,S= abcd123ab888efghij45ef67kl, S1= ab原创 2022-08-14 10:02:00 · 176 阅读 · 0 评论 -
【分治法】快速排序
一、快速排序:快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。(第一个数) 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 3.再对左右区间重复第二步,直到各区间只有一个数。 二、思路分析1、两个主要功能函数:int find(int *b,int left,int right.原创 2021-12-25 16:14:15 · 2348 阅读 · 2 评论 -
【手把手刷CCF】202209-2-何以包邮100(读过必懂,含思路解释、详细注释与代码)
算法思路与求解步骤✌a、分析:目标:即求一组i使得Min(∑ai) 且 (∑ai)>x抽象:即选部分物品,求和其价格和最小且满足>x联想:许多物品,单个物品放与不放,联想至0/1背包问题先前我写过的“0/1背包博文”:【动态规划法】0-1背包问题博文,点我即可直达哦~b、结合此题的具体分析与步骤:我的解法:回溯与分支限界法回溯法专栏:【回溯法】专栏,点击我即可直达哦~分支限界法专栏:【分支限界法】专栏,点击我即可直达哦~c、代码过程:c1、准备/算法依托媒介:数组b[N]:其取值为原创 2022-10-10 17:30:12 · 4679 阅读 · 12 评论 -
【算法设计与分析】动态规划法与分治法、贪心法的区别
一、动态规划法与分治法1、相同点:两者相似,通过合并多个子问题的解来解决整体问题。2、区别:(1)、分治法是把大问题分解成一些相互独立的子问题,递归的求解这些子问题,然后将他们合并来得到整个问题的解。 (2)、动态规划法是通过组合子问题的解来解决整个大问题。各个子问题不是独立的,即各个子问题包含公共子问题。...原创 2022-01-12 14:03:25 · 1987 阅读 · 0 评论 -
【算法设计与分析】4、动态规划法
一、基本要素:1、最优子结构性质:一个问题的最优解包含着其子问题的最优解。2、重叠子问题性质:自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。二、基本步骤1、找出最优解性质,并刻画其结构特征。2、递归定义最优值。3、由自底向上的方式计算出最优值。4、根据计算最优值时得到的信息,构造最优值。三、典型例题1、所有点对的最短路径问题。(Floyd算法 )2、最长公共子序列问题。3、求子段和最大值问题。...原创 2022-01-12 13:47:36 · 439 阅读 · 0 评论 -
【算法设计与分析】5、分治法
一、基本思想1、问题能够按照某种方式分解成若干个规模较小,相互独立且与问题类型相同的子问题。2、问题足够小时,可以直接求解。3、能够将子问题的解组合成原问题的解。(递归)二、典型例题1、快速排序。2、子段和最大值...原创 2022-01-12 13:40:20 · 272 阅读 · 0 评论 -
【算法设计与分析】2、回溯法
一、解的表现形式一般回溯法,其解满足事先定义好的某个约束的向量(X1,X2,……Xn),要善于将变长解转化为定长解。二、基本思想每个xi属于一个有限的线序集Xi。解向量空间取值属于:X1 x X2 ……Xn (笛卡尔积的元素)。1、算法由空向量开始,选X1最小元素加入。2、若x1为部分解,则选X2中最小元素作为x2加入,依次类推。若部分为:(x1,x2,……xj)需考虑下一情况 v= (x...原创 2022-01-12 13:36:10 · 463 阅读 · 0 评论 -
【算法设计与分析】3、贪心法
一、基本要素1、贪心选择性质:所求问题的整体最优解可以通过一系列局部最优解的选择,即贪心选择来达到。2、最优子结构性质:一个问题的最优解包含着其子问题的最优解。二、特点1、迭代(在维持可行性的前提下,它选择能产生最大直接利益的项)。2、自顶向下的方式进行。3、贪心法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。(例:单源最短路径问题,最小生成树...原创 2022-01-12 13:19:10 · 654 阅读 · 0 评论 -
买卖股票问题
1、问题如下:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。(先买入,后卖出)2、代码如下:#include <bits/stdc++.h>using namespace std;#define N 10000int n=0;//记录股票价格的天数 int MinLeft=0;//此天之前的最小值int MaxRight=0;//记录此天以及此天之后股原创 2021-12-04 21:45:54 · 520 阅读 · 2 评论 -
“递归算法”求数组最大值(含详细注释解析C++)
一、信息须知:递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。二、非递归普通循环求解最大值#include <iostream>using namespace std;int A[200];int main(){ int n;cin>>n; for(int i=0;i<n;i++原创 2021-09-30 17:23:56 · 3975 阅读 · 0 评论