- 博客(53)
- 资源 (2)
- 问答 (2)
- 收藏
- 关注
原创 编写一个将输入复制到输出的程序,并将其中的一个或多个连续的空格用一个空格代替
#include int main(){ int c; int inspace=0; while((c=getchar())!=EOF) { if(c==' ') { if(inspace==0)//,如果c为空格,只有在inspace为0时才输出字符c { inspace=1; putchar(c); } } i
2013-09-20 10:02:53
1140
原创 贪心算法解决部分背包问题 在O(lgn)时间内
//16.2-6 部分背包问题#include using namespace std;struct Object//物品信息结构体{ int weight;//物品重量 int value;//物品价值 float num;//可以装入的物品数量 int avl;//物品的单位价值};void swap(Object *p,Object *q)//交换两个元素{ Ob
2013-09-19 19:00:58
2718
原创 算法导论答案 16.2-4
//16.2-4#include using namespace std;#define N 6int x[N+1]={0,10,40,60,90,120,140},f[N+1]={0};//f用于标记某一站是否加油,x[i]表示第i个加油站距离起始点的距离void Greedy_Select(int x[],int f[])//选择在哪一个加油站停车{ int n=30;//邮箱
2013-09-19 10:51:11
4214
原创 算法导论答案 16.2-2 0-1背包问题的动态规划算法
//16.2-2 动态规划算法求解0-1背包问题#include using namespace std;#define W 50#define N 3int v[N+1]={0,60,100,120};//物品价值int w[N+1]={0,10,20,30};//物品重量int c[N+1][W+1]={0};//c[i][j]表示在剩余容量为j的情况下,对于物品1.....
2013-09-18 10:20:16
2259
原创 算法导论 16.1-1活动选择问题的动态规划算法 答案
//16.1-1 活动选择问题的动态规划算法#include #include #define N 11void dynamic_activity_selector(int *s,int *f,int c[N+1][N+1],int ret[N+1][N+1]);void trace_route(int ret[N+1][N+1],int i,int j);void dynam
2013-09-17 11:01:31
3231
1
原创 算法导论 第16章 活动选择问题的递归和迭代贪心算法
/*//递归贪心算法求解活动选择问题#include using namespace std;#define N 11int s[N+1]={0,1,3,0,5,3,5,6,8,8,2,12};int f[N+1]={0,4,5,6,7,8,9,10,11,12,13,14};int a[N+1];void Recursive_Activity_Selector(int s[
2013-09-17 09:15:30
1561
原创 算法导论思考题答案 思考题15-2 整齐打印
解决思路: 由问题描述可知道,我们需要做的就是n个单词分成若干份,这与矩阵连乘问题有相似之处。行尾的额外空格符数量M-j+i-∑lk(iM-(j-i)-∑lk,其中j-i是表示该行各个单词之间相隔的空格数量。我们设lc[i,j]是第i个单词到第j个单词的额外空格符数量的立方,即是(M-j+i-∑lk)3(ilc[i,j]=∞,当M-j+i-∑lklc[i,j]=0,当M-j
2013-09-16 18:56:57
1883
原创 算法导论答案 思考题15-1 双欧几里德旅行商问题
解题思路:根据简化后的双调欧几里得旅行问题的性质,将点集依据各点x坐标单调递增来进行编号,我们设b[i,j]是最短双调闭合旅程P(i,j)的长度(iP(i,j)是指从点P[i]开始,严格地向左走(即是每次经过的点的x坐标都比前一个点的x坐标要小),直到最左点P[1],然后再严格向右走,直到终点P[j]为止,在从P[i]到P[j]过程中的点有且只经过一次。设distance[i,j]是点
2013-09-16 11:06:24
1464
原创 算法导论15.5 最优二叉查找树
//15.5最优二叉查找树# includeusing namespace std;#define N 5double e[N+2][N+2]={0},w[N+2][N+2]={0};int root[N+2][N+2]={0};void Optimal_Bst(double p[],double q[],int n)//{ int i,j,l,r; double t; f
2013-09-11 11:11:48
1054
原创 算法导论15.4-5 答案
//15.4-5请给出一个O(n的平方)的算法,使之能找出一个n个数的序列中最长的单调递增子序列#include #include using namespace std;int c[10][10];int b[10][10];#define x 10#define y 10int A[10]={0,2,4,5,9,8,7,6,8,9};int partition(int A
2013-09-10 10:40:48
2295
原创 算法导论15.4 最长公共子序列
//15.4最长公共子序列#include #include using namespace std;int c[8][7];int b[8][7];#define x 8#define y 7void Lcs_Length(char s1[x],char s2[y])//求解最长公共序列{ int i,j; for(i=1;i<x;++i) c[i][0]=0; f
2013-09-05 11:08:06
864
原创 15.2 矩阵链乘法
//15.2矩阵链乘法# include using namespace std;#define Length 7int P[7],M[7][7],S[7][7];void Input()//输入矩阵的维数{ int i; for(i=0;i<7;++i) cin>>P[i];}void Matrix_Chain_Order()//求矩阵的链乘法序列{ int i
2013-09-03 20:32:59
524
原创 算法导论15.1 装配线调度问题
//15.1装配线调度问题#include using namespace std;#define I 2#define J 6int a[I+1][J+1],e[I+1],x[I+1],t[I+1][J+1],n=J;int f[I+1][J+1],l[I+1][J+1],rf,rl;void Input()//输入{ int i,j; for(i=1;i<=I;++i
2013-09-03 10:02:16
1065
原创 算法导论12.1-3答案
//12.1-3 给出一个非递归的中序树遍历算法#include using namespace std;//二叉树结点的结构体struct node{ int key;//值 node *left;//指向左孩子 node *right;//指向右孩子 node(){}//默认构造函数 node(int x):key(x),left(NULL),right(NULL){}/
2013-08-28 11:39:14
1075
原创 算法导论11.1-4答案
//11.1-4#include #include int Search(int Array[],int Stack[],int x){ int p=Array[x]; if(p>0&&p<Stack[0]&&x==Stack[p]) return p; return 0;}int Insert(int Array[],int Stack[],int x){ int
2013-08-25 11:56:13
1001
原创 算法导论10.2-7答案
//10.2-7请给出一个O(n)时间的非递归过程,它对含n个元素的单链表的链进行逆转。除了链表本身占用的空间外,该过程应仅使用固定量的存储空间#include #include #define NULL 0typedef struct CirList{ int Element; CirList *Next;}*Cl;Cl InitCirList(){ Cl list;
2013-08-24 18:43:20
972
原创 算法导论10.2-6答案
//10.2-6 动态集合Union以两个不相交的集合S1和S2作为输入,输出集合S=S1US2包含了S1和S2的所有元素。该操作常常会破坏S1和S2。//说明应如何选用一种合适的表数据结构,以便支持在O(1)时间内的UNION操作。方法是在链表中设置尾指针,然后将其中一个链表的尾指针连接到另一个链表的表头#include #include typedef struct CirList
2013-08-23 23:28:09
1164
原创 10.2-5 用环形单链表来实现字典操作INSERT、DELETE和SEARCH,并给出它们的运行时间 算法导论答案
//10.2-5 用环形单链表来实现字典操作INSERT、DELETE和SEARCH,并给出它们的运行时间#include #include typedef struct CirList{ int Element; CirList *Next;}*Cl;Cl InitCirList(){ Cl list; list=(Cl)malloc(sizeof(struct Cir
2013-08-23 22:12:56
1072
原创 用一个单链表L实现一个栈 要求PUSH和POP操作的时间仍为O(1) 算法导论10.2-2答案
#include #include #define NULL 0typedef struct Stack *S1;typedef struct Node{ int Element; Node *next;}Snode,*node;struct Stack{ Snode *top;};S1 InitStack(){ S1 s; s=(S1)malloc(sizeo
2013-08-23 19:41:11
2921
2
原创 用两个队列实现一个栈 算法导论10.1-7答案
//用两个队列实现一个栈#include #include typedef struct Queue *Qu;struct Queue{ int Front; int Rear; int *Array; int size;};Qu InitQueue(int size){ Qu Q; Q=(Qu)malloc(sizeof(struct Queue)); Q->F
2013-08-23 17:32:24
926
原创 算法导论10.1-2答案
//10.1-2 说明如何用一个数组A[1...n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢。注意PUSH和POP操作的时间应为O(1)#include #include struct Stack;typedef struct Stack *St;#define N 10struct Stack{ int Left_Top; int Right_Top;
2013-08-22 22:34:31
1495
原创 从一个数组中找出第k小元素的随机化算法 c语言实现 算法导论第九章
//Randomized_select,select a particular number from an array in linear time#include #include void swap(int *p,int *q)//交换元素{int temp;temp=*p;*p=*q;*q=temp;}int Random(int p,int r)/
2013-08-05 21:45:44
1663
原创 同时找出数组的最大值和最小值,要求时间复杂度为o(n)
#include void max_min(int A[],int n,int& max,int& min){int i;if(n%2==0){if(A[0]>A[1]){max=A[0];min=A[1];}else{max=A[1];min=A[0];}for(i=2;i{if(A[i]>A[i+1]){i
2013-08-05 20:31:21
7365
原创 基数排序 C语言实现
//Radix_Sort#include #include /*被排序元素的最大位数,4则意味着只能排序#define WIDTH 4 #define MAXK 10 //位数划分基于的基数,10表示为10进制划分void radixSort(int a[], int n) {int i;void innerCountingSort(int a[],
2013-08-04 23:01:17
1288
原创 堆排序C语言实现 算法导论
//Heap_sort#include int Left(int i)//return left child{return 2*i+1;}int Right(int i)//return right child{return 2*i+2;}void swap(int *p1,int *p2){int temp;te
2013-08-04 17:11:05
691
原创 快速排序的随机化算法
//快速排序的随机化算法#include #include #define N 10//Exchange the valuevoid swap(int *p,int *q){int temp;temp=*p;*p=*q;*q=temp;}//generate a random number between p and qint rando
2013-07-30 22:17:50
660
原创 用斯特拉森算法求解矩阵乘法
#include #define N 2//matrix + matrixvoid plus( int t[N/2][N/2], int r[N/2][N/2], int s[N/2][N/2] ){int i, j;for( i = 0; i {for( j = 0; j {t[i][j] = r[i][j] + s[i][j];}
2013-07-30 12:07:20
2349
原创 利用矩阵求解fibonacci数列 时间复杂度为O(lgn)
//利用矩阵求解fibonacci数列#include #include ///////////////////////////////////////////////////////////////////////// A 2 by 2 matrix////////////////////////////////////////////////////////////////
2013-07-30 10:46:22
956
原创 寻找逆序对的算法,要求运行时间为O(nlgn),算法导论答案
#include int merge_inversion(int A[],int p,int q,int r){int n1,n2,i,j,k,num=0;n1=q-p+1;n2=r-q;int L[10],R[10];for(i=0;i!=n1;++i)L[i]=A[p+i];for(j=0;j!=n2;++j)R[j]=A[q+j+1];L[n1]=
2013-07-23 23:54:41
1102
原创 删除有序数组中重复元素的一个非常简洁的算法
#include int removeDuplicate( int* source, const int size ){ int curPos = 1; for( int i = 1; i if( source[i] != source[i-1] ) source[curPos++] = source[i]; return size
2013-07-22 22:52:09
1048
原创 算法导论课后题 2.3-7答案
题目:请给出一个运行时间为O ( n lg n ) 的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。解决该问题的算法如下:1.对S中的元素进行排序(需要运行时间为O ( n lg n ) 的算法);2.构造一个集合S'={{ z : z = x − y }.(其中x我们要判断的元素,y为S中的所有元素);3.对S'中的元素进
2013-07-22 22:33:26
1267
原创 算法导论2.3-5答案 分别采用递归与非递归方式实现二分查找 c++实现
//2.3-5 采用递归方式的二分查找,注意输入的数组是有顺序的#include #include using namespace std;vector::size_type Binary_Search(vector A,int key,vector::size_type first,vector::size_type last){if(first>last)r
2013-07-20 10:51:41
918
原创 归并排序 (不采用哨兵) 算法导论2.3-2答案
# include#define NULL 0void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; w
2013-07-19 16:35:35
1358
原创 算法导论第二版2.2-2 答案
#include #include using namespace std;int main(){vector A;int x;coutwhile(cin>>x)A.push_back(x);for(vector::size_type i=0;i{int m=i;for(vector::size_type j=i+1;j{if
2013-07-19 09:37:42
1347
原创 算法导论第二版 习题2.1-4答案
#include #define n 5void main(){int A[n]={0,1,1,0,1},B[n]={0,0,1,1,0};int C[n+1]={0};for(int i=0;i{if((A[i]+B[i]+C[i])==2){C[i+1]=1;C[i]=0;}elseif((A[i]+B[i]+C[i])==3)
2013-07-18 20:24:41
1517
原创 理解何时执行哪个构造函数和复制控制成员
C++ Primer第四版习题13.14 理解复制控制成员和构造函数的一个良好方式是定义一个简单的类,该类具有这些成员,每个成员打印自己的名字:struct Exmpl { Exmpl() {std::cout Exmpl(const Exmpl&) { std::cout //...};编写一个像Exmpl这样的类,给出复制控制成员和其他构造函
2013-07-12 21:10:23
858
原创 基数排序
//为什么不从高位到低位排序,首先输入的所有的数中的各个数的位数不一定相同,只通过对高位进行一次排序是不行的,#include using namespace std;const int base=10;//struct wx{ int num; wx *next; wx() {
2013-06-05 22:30:28
764
原创 计数排序
//计数排序# includevoid Count_Sort(int A[],int len,int B[],int k){int c[10];for(int i=0;i{c[i]=0;}//c[i]包含等于i的元素个数for(int j=1;j{c[A[j]]=c[A[j]]+1;}//c[i]为包含小于或等于i的元素个数for(i=1
2013-06-04 21:24:01
515
原创 桶排序
#include 2 #include 3 4 using namespace std; 5 6 struct Node 7 { 8 double value; 9 Node *next; 10 }; 11 //桶排序主程序 12 void bucketSort(double* arr, in
2013-06-03 22:12:34
628
原创 容器迭代器失效问题
众所周知当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此很多建议都是让我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作:view plaincopy to clipboardprint?iter=vec.insert(iter); iter=vec.erase(iter);
2013-05-29 10:47:20
809
1
下载android源码出现错误
2016-12-04
有关插入排序的问题 c++实现
2013-07-18
TA创建的收藏夹 TA关注的收藏夹
TA关注的人