算法分析课
柳小茶
早睡早起
展开
-
贪心算法之虚拟汽车加油问题
题目描述一辆虚拟汽车加满油后可以行驶n km。途中有若干个加油站。设计一个有效的算法,指出应在那个加油站停靠加油,使沿途加油次数最少。测试数据输入7 71 2 3 4 5 1 6 6输出4#include<iostream>#include<vector>using namespace std;//将n分解为若互不相同的自然数的和 使他们的乘积最大#define Max 100005int main(){ int...原创 2021-05-08 12:33:59 · 385 阅读 · 0 评论 -
贪心算法之最优分解问题
题目描述设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大。数据分析输入10输出30分析1.根据根绝均值不等式的成立条件可知,若a+b=const,则|a-b|越小,a·b越大。2.当n<4时:对n的分解的乘积是小于n的,应该选择不分解。 当n>=4时:n=1+(n-1)<n,所以至少要从2开始分解,可以保证乘积大于n,即越分解乘积越大。...原创 2021-05-08 12:31:13 · 2328 阅读 · 2 评论 -
贪心算法之最优合并问题
题目描述给定k个排好序的序列,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并2个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确认合并这个序列的最优合并顺序,使所需的总比较次数最少。为了进行比较,还需要确认合并这个序列的最差合并顺序,使所需的总比较次数最多。对于给定的k个待合并序列,计算最多比较次数和最少比较次数合并方案。测试数据输入4(k个)5 12 11 2 (每个序列的个数)输出78 52分析最优策略:每次选择个数小..原创 2021-05-08 12:24:09 · 4819 阅读 · 0 评论 -
贪心算法之会场安排
题目描述假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个算法进行安排。测试样例输入5(活动数目)1 23 (1是开始时间,23是结束时间)12 2825 3527 8036 50输出3分析:贪心算法 满足局部最优解即可会场安排满足:上一个结束的时间<下一个开始的时间 ----(1)将所有时间的开始时间和结束时间分别放入 beg[],和 end[] 数组中存储 并均按升序排列当出现beg[i]&...原创 2021-05-08 12:15:19 · 774 阅读 · 0 评论 -
动态规划之最小m段和问题
题目描述 给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?样例输入输入:1 110输出:10输入:9 39 8 7 6 5 4 3 2 1输出:17最优子结构:dp[i][j]: i个数字划分j段的最大值的最小值j-1段和j段比较最大值#include<iostream>#include<cstring&g...原创 2021-05-08 12:01:40 · 2507 阅读 · 0 评论 -
动态规划之最大K乘积
题目:设I是一个n位十进制整数。如果将I分割为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。测试样例:输入 :2 1 (2是位数,1是分几段)15 (15是I)输出:15输入:5 212345输出:6170最优子问题:前k-1段的最优解*剩下的乘积#include<iostream>using namespace std;//分解成...原创 2021-05-08 09:27:57 · 463 阅读 · 0 评论 -
动态规划之环形石子合并问题
题目在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选择相邻的两堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。测试用例:输入:4(石子的堆数)4 4 5 9(每一堆的石子数目)输出:43 54分析:我们知道链式的石子合并问题是相邻两堆之间可以合并,那么环形的和链式的区别就在于,环形的相当于是链式的头尾两堆也能合并那么,我们只要解决,如何在链式的基础上.原创 2021-05-08 09:22:20 · 1658 阅读 · 0 评论 -
动态规划之独立任务最优调度
问题概述用 2 台处理机 A 和 B 处理 n 个作业。设第 i 个作业交给机器 A 处理时需要时间 i a ,若 由机器 B 来处理,则需要时间 i b 。由于各作业的特点和机器的性能关系,很可能对于某些 i, 有 i i a ³ b ,而对于某些 j,j≠i,有a j < bj 。既不能将一个作业分开由 2 台机器处理,也 没有一台机器能同时处理 2 个作业。设计一个动态规划算法,使得这 2 台机器处理完这 n 个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。编程任务原创 2021-05-08 09:03:11 · 1502 阅读 · 5 评论 -
算法分析02-有重复元素的全排列
#include<iostream>using namespace std;#define Max 100005int list[Max];int n;bool judge(int a,int b){ for(int i=a;i<b;i++){ if(list[i]==list[b]) return false; } return true;}void perm (int k,int m){ if (k==m.原创 2021-03-10 22:09:40 · 269 阅读 · 0 评论 -
算法分析01-统计数字(区间法)
#include<iostream>#include<math.h>using namespace std;int arr[10];//n 10f(n-1)+10^(n-2);int count(int n){ if(n==1) return 1; return (10*count(n-1)+pow(10.0,n-2));}int main(){ int n; cin>>n; while(n){ int l.原创 2021-03-10 22:08:55 · 345 阅读 · 0 评论