- 博客(56)
- 收藏
- 关注
原创 【回溯法】最佳调度问题
#include<bits/stdc++.h>using namespace std;int n,k;int t[999];//完成工作i所需的时间 int best=999;//best为最终结果 即完成任务的最早时间 int len[999]={0};// 为机器j工作的时间 int comp(){ int tmp=0; for(int j=0;j<k;j++) if(len[j]>tmp) tmp=len[j]; return tmp;}void
2021-05-29 17:02:10
415
原创 【回溯法】工作分配问题
#include<bits/stdc++.h>using namespace std;int n,c[999][999];//n个工作,c[i][j]为将工作i分配给第j个人所需的费用 int x[999];//第j个人是否被安排工作int sum=0;//总费用int minc=999;void backtrack(int i){ if(i>n)//到底 { if(minc>sum) minc=sum; return; } for(int
2021-05-28 18:24:04
432
原创 【回溯法】最小重量机器设计问题
#include<bits/stdc++.h>using namespace std;int n,m,d;//n个部件,m个供应商,总价格不超过dint c[999][999];//c[i][j]为从供应商j购买部件i所花费的价格;int w[999][999];//w[i][j]为......重量int cw=0,cp=0;//当前部件的重量 价格int bestw=999,bestp=999;//最优方案的重量,价格int x[999];//当前部件i从供应商j购买int b
2021-05-28 16:17:20
619
原创 【回溯法】子集和问题
#include<bits/stdc++.h>using namespace std;int t=0,r=0;int w[999],x[999]={0};int flag;int n,c;void backtrack(int i){ if(t==c) { for(int j=0;j<n;j++){ if(x[j]==1){ cout<<w[j]<<" "; } } flag=true; return; }
2021-05-27 11:25:14
581
原创 最优分解问题 c++ 详解
设n是一个正整数,要求将n分解为若干互不相同的自然数之和,且这些自然数的乘积最大。输入:正整数n输出:计算的最大乘积。如输入10,则输出30.提示:若a+b=const ,则a-b的绝对值越小,ab值越大。贪心策略:将n分成从2开始的连续自然数之和,如果最后剩下一个数,则将此数在后项优先的方式下均匀地分给前面各项。#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; if(n&l
2021-05-12 23:17:54
1091
原创 虚拟汽车加油问题 c++ 贪心讲解
问题描述:一辆虚拟汽车加满油后可行驶 n km。旅途中有若干加油站。设计一个有效算法,指出应该在那些加油站停靠加油,使沿途加油次数最少。并证明算法能产生一个最优解。算法设计:对于给定的n和k个加油站位置,计算最少次数。数据输入:第一行有两个整数n和k,表示汽车加满油后可行驶n km,且旅途中有k个加油站。接下来的1行有k+1个整数,表示第k个加油站与第k-1个加油站的之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。输入示例:7 71 2 3 4 5 1 6 6
2021-05-12 22:09:32
702
原创 最优服务次序问题 贪心算法
设有n 个顾客同时等待一项服务。顾客i需要的服务时间为t i,1≤i≤n。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。对于给定的n 个顾客需要的服务时间,计算最优服务次序。输入:输入数据的第一行是正整数n(n≤1000),表示有n 个顾客。接下来的1行中,有n 个正整数,表示n 个顾客需要的服务时间。输出:输出一个实数,保留2位小数,表示计算出的最小平均等待时间。示例输入:1056 12 1 99 1000 234 33 55 9
2021-05-12 13:05:38
427
1
原创 最优合并问题 贪心算法 c++
题目描述:给定k个排好序的序列,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并2个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确认合并这个序列的最优合并顺序,使所需的总比较次数最少。为了进行比较,还需要确认合并这个序列的最差合并顺序,使所需的总比较次数最多。对于给定的k个待合并序列,计算最多比较次数和最少比较次数合并方案。输入描述:第一行有1个正整数k,表示有k个待合并序列。接下来的1行中,有k个正整数,表示k个待合并序列的长度。输出描述:输出最多比较次数和最
2021-05-12 11:35:45
1091
原创 会场安排问题 (贪心算法)
题目描述假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排#include<bits/stdc++.h>using namespace std;struct act{ int begin; int end; int belong;};bool compare(struct act a,struct act b){ return a.begin<b.begin; if(a.begin==b.begin) return a.
2021-05-11 22:09:55
1194
2
原创 【动态规划】最大k乘积问题(c++ 含讲解)
设I是一个 n位十进制整数。如果将I划分为 k段,则可得到k个整数。这k个整数的 乘积称为I的一个 k乘积。试设计一个算法,对于给定的 I和 k,求出 I的最大 k乘积。 对于给定的I和k,计算 I的最大 k乘积.#include<bits/stdc++.h>using namespace std; string str;int conv(int i,int j){ string str1=str.substr(i,j); return atoi(str1.c_str());}
2021-04-29 11:28:58
2395
原创 最小m段和问题 动态规划 c++含讲解
最小m段和问题给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?#include<bits/stdc++.h>using namespace std;void solve(int n,int m,int *t){ int i,j,k,mint,maxt; int f[n][m]; //当j=1 即分为1段时 for(i=1;i<=n;i++) f[i][1]=f[i-1][1]+t[i
2021-04-28 11:31:10
2401
原创 石子合并问题
环行石子合并问题在一个圆形操场的四周摆放着n堆石子,现将石子有次序的合并在一起,规定每次只能将相邻的两堆石子合并成一堆,并将新的一堆石子数记为该次合并的得分,计算出将n堆石子合并成一堆的最小得分和最大得分#include<bits/stdc++.h>using namespace std;const int N=410,INF=0x3f3f3f3f;int n;int a[N];int s[N];int f[N][N];int g[N][N];int main(){ me
2021-04-28 10:46:05
530
原创 独立任务最优调度问题 动态规划 含讲解
任务调度问题题目:用2 台处理机A 和B 处理n 个作业。设第i 个作业交给机器A 处理时需要时间i a ,若由机器B 来处理,则需要时间i b 。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai >=bi,而对于某些j,j≠i,有aj < bj 。既不能将一个作业分开由2 台机器处理,也没有一台机器能同时处理2 个作业。设计一个动态规划算法,使得这2 台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。研究一个实例: (a1,a2,a3,a4,a5,a
2021-04-27 11:48:44
610
原创 算法设计与分析实验题
统计数字问题#include<iostream>#include<cstdio>#include<cmath>using namespace std;int c[10];void solve(int n){ int len=log10(n)+1;//数的位数 //00-2999 int p=n/((int)round(pow(10.0,len-1)));//区间数 0-33330 有3个区间 for(int
2021-04-15 11:25:14
371
1
原创 图3 六度空间
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的
2020-12-09 17:13:41
146
原创 Saving James Bond - Easy Version 拯救007(25分)
#include<bits/stdc++.h>using namespace std;int G[30][30];int vis[30];struct location{ int x; int y;}loc[100]; float dic(location a,location b){ return pow(pow(a.x-b.x,2)+pow(a.y-b.y,2),0.5);}bool DFS(int cur,int n){ if(cur==n+1) return
2020-12-09 08:49:32
224
原创 列出连通集 (25分)
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。输出格式:按照"{ v1 v2 … vk }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。8 60 70 1
2020-12-07 22:26:21
269
原创 2-2 畅通工程之局部最小花费问题 (有分析和测试点)
2-2 畅通工程之局部最小花费问题 (30分)某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全地区畅通需要的最低成本。输入格式:输入的第一行给出村庄数目N (1≤N≤100);随后的N(N−1)/2行对应村庄间道路的成本及修建状态:每行给
2020-11-27 18:57:01
1972
6
原创 6-5 共享后缀的链表 (20分)
有一种存储英文单词的方法,是把单词的所有字母串在一个单链表上。为了节省一点空间,如果有两个单词有同样的后缀,就让它们共享这个后缀。下图给出了单词“loading”和“being”的存储形式。本题要求你找出两个链表的公共后缀。函数接口定义:PtrToNode Suffix( List L1, List L2 );其中List结构定义如下:typedef struct Node PtrToNode;struct Node {ElementType Data; / 存储结点数据 /PtrToNod
2020-11-17 14:03:49
879
原创 6-1 在一个数组中实现两个堆栈 (20分)
本题要求在一个数组中实现两个堆栈。函数接口定义:Stack CreateStack( int MaxSize );bool Push( Stack S, ElementType X, int Tag );ElementType Pop( Stack S, int Tag );其中Tag是堆栈编号,取1或2;MaxSize堆栈数组的规模;Stack结构定义如下:typedef int Position;struct SNode {ElementType *Data;Position Top1
2020-11-17 13:39:21
1204
原创 7-2 两个有序链表序列的合并
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。输入样例:1 3 5 -12 4 6 8 10 -1输出样例:1 2 3 4 5 6 8 10 vector的作用和一维数组相似,所以不能确定数组的大小,或者因为数组大
2020-11-17 10:38:15
565
原创 二叉搜索树(04-树4 是否同一棵二叉搜索树 (25分))
1.二叉搜索树(二叉排序树,二叉查找树).它或许是一棵空树,或许是具有以下性质的二叉树:.若他的左子树不为空,则左子树上所有节点的值都小于根节点的值.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值.它的左右子树也分别是二叉搜索树 <1>树的建立 :先创建一个树结点,然后依次输入值,根据树值的大小,插入树中输入样例6 4 2 5 1 3 6#include<stdio.h>#include<stdlib.h>typedef struct t
2020-11-15 22:31:49
238
原创 树种统计 (20分)
随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。输入格式:输入首先给出正整数N(≤105 ),随后N行,每行给出卫星观测到的一棵树的种类名称。种类名称由不超过30个英文字母和空格组成(大小写不区分)。输出格式:按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位。输入样例:29Red AlderAshAspenBasswoodAshBeechYellow B
2020-11-15 17:14:15
713
原创 7-5 部落 (20分)
7-5 部落 (20分)在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。输入格式:输入在第一行给出一个正整数N(≤104 ),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人:K P[1] P[2] ⋯ P[K]其中K是小圈子里的人数,P[i](i=1,⋯,K)是小圈子里每个人的编号。这里所有人的编号从1开始连续
2020-11-15 16:25:14
260
原创 7-3 顺序存储的二叉树的最近的公共祖先问题 (20分)
设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。输入格式:输入第1行给出正整数n(≤1000),即顺序存储的最大容量;第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号i和j。题目保证输入正确对应一棵二叉树,且1≤i,j≤n。输出格式:如果i或j对应的是空结点,则输出ERROR: T[x] is NULL,其中x是i或j中先发现错误的那个编号;否则在一行中输出编号为i和j的两
2020-11-14 19:36:17
647
原创 7-4 树的遍历 (20分)
7-4 树的遍历 (20分)给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:72 3 1 5 7 6 41 2 3 4 5 6 7输出样例:4 1 6 3 5 7 2#include<bits/s
2020-11-13 20:19:03
316
原创 还原二叉树
1./给出先序序列,中序序列,结点数还原二叉树 //给出先序序列,中序序列,结点数还原二叉树 #include<bits/stdc++.h>using namespace std;typedef struct tree *BT;struct tree{ char data; BT left; BT right;};char v1[10000],v2[10000];BT creat(int root,int beg,int len){ if (len<=0) re
2020-11-11 20:57:58
348
原创 7-1 树的同构 (20分)
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。图1图2现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、
2020-11-10 14:53:32
374
原创 kmp的模式匹配
KMP 串的模式匹配 (25分)给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:数据0:小规模字符串,测试基本正确性;数据1:随机数据,String 长度为 105 ,Pattern 长度为 10;数据2:随机数据,String 长度为 105
2020-11-08 09:59:45
123
原创 03-树3 Tree Traversals Again (25分)
03-树3 Tree Traversals Again (25分)An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push
2020-11-08 08:58:56
194
原创 03-树2 List Leaves (25分)
03-树2 List Leaves (25分)Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.Input Specification:Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is
2020-11-07 19:33:03
82
原创 03-树1 树的同构 (25分)
03-树1 树的同构 (25分)给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。图1图2现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个
2020-11-06 22:27:00
109
原创 4-13 先序输出叶结点 (10分)
本题要求按照先序遍历的顺序输出给定二叉树的叶结点。函数接口定义:void PreorderPrintLeaves( BinTree BT );其中BinTree结构定义如下:typedef struct TNode *Position;typedef Position BinTree;struct TNode{ElementType Data;BinTree Left;BinTree Right;};函数PreorderPrintLeaves应按照先序遍历的顺序输出给定二叉树BT的叶结
2020-11-03 13:24:43
319
原创 1021 个位数统计 (15分)
1021 个位数统计 (15分)给定一个 k 位整数 N=dk−1 10k−1 +⋯+d1 101 +d0 (0≤di ≤9, i=0,⋯,k−1, dk−1 >0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。输入格式:每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。输出格式:对 N 中每一种不同的个位数字,以 D:M 的
2020-11-02 18:20:42
440
原创 1020 月饼 (25分)
1020 月饼 (25分)月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 =
2020-11-02 17:46:32
126
原创 1017 A除以B (20分)
1017 A除以B (20分)本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。输入格式:输入在一行中依次给出 A 和 B,中间以 1 空格分隔。输出格式:在一行中依次输出 Q 和 R,中间以 1 空格分隔。输入样例:123456789050987654321 7输出样例:17636684150141093474 3作者CHEN, Yue单位浙江大学代码长度限制16 KB时间限制
2020-11-01 15:57:08
397
原创 1002 写出这个数 (20分)
1002 写出这个数 (20分)读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。输入格式:每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100 。输出格式:在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。输入样例:1234567890987654321123456789输出样例:yi san wu`#include<iostream>#include&l
2020-10-29 12:10:29
175
原创 2-1 Add Two Polynomials (20分)
2-1 Add Two Polynomials (20分)Write a function to add two polynomials. Do not destroy the input. Use a linked list implementation with a dummy head node. Note: The zero polynomial is represented by an empty list with only the dummy head node.Format of fun
2020-10-22 21:31:20
1044
原创 1-10 链表去重 (20分)
1-10 链表去重 (20分)给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。输入格式:输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤105 ,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。
2020-10-21 21:42:59
342
原创 1-6 求链式线性表的倒数第K项(不同的思路 3种方法)
1-6 求链式线性表的倒数第K项 (20分)给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。输入格式:输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。输出格式:输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。输入样例:4 1 2 3 4 5 6 7 8 9 0 -1输出样例:7#include<stdio.h> #include<stdlib.h>typed
2020-10-21 11:48:20
3092
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人