1、brk释放内存和sbrk分配内存 #include<unistd.h> int brk(void *end_data_segment); 成功返回0,否则为-1 将内存边界设置为参数所指定位置 void *sbrk(intptr_t increment); 成功返回之前的内存边界,失败返回(void*)-1 增加内存边界,返回为新分配内存的起始位置(sbrk(0)就是获得堆位置) 使用的例子 #include <iostream> #include <unistd.h> using namespace std; int main() { int* phead; // 指向首位置 int* pnow; // 指向当前指针位置 pnow = sbrk(0); // 先分配空闲区域 phead = pnow; // 固定首位置不变 for(int i=2; i<10000; i++) { 继续阅读 >>


陈文浩 18/08/13 15:41:54
879. 盈利计划 帮派里有 G 名成员,他们可能犯下各种各样的罪行。 第 i 种犯罪会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与。 让我们把这些犯罪的任何子集称为盈利计划,该计划至少产生 P 的利润。 有多少种方案可以选择?因为答案很大,所以返回它模 10^9 + 7 的值。 示例 1: 输入:G = 5, P = 3, group = [2,2], profit = [2,3] 输出:2 解释: 至少产生 3 的利润,该帮派可以犯下罪 0 和罪 1 ,或仅犯下罪 1 。 总的来说,有两种方案。 示例 2: 输入:G = 10, P = 5, group = [2,3,5], profit = [6,7,8] 输出:7 解释: 至少产生 5 的利润,只要他们犯其中一种罪就行,所以该帮派可以犯下任何罪行 。 有 7 种可能的计划:(0),(1),(2),(0,1),(0,2),(1,2),以及 (0,1,2) 。 提示: 1 <= G <= 继续阅读 >>


陈文浩 18/07/30 21:41:40
以前没有认真的总结readline,发现它的功能还是很赞的,这次记录一下,方便日后查看 安装 在deepin下可以用这个命令(Ubuntu和deepin一样) sudo apt-get install libreadline6-dev 原型 #include <readline/readline.h> #include <readline/history.h> ①char *readline (const char *prompt);//返回值就是读取的字符串 ②void add_history(const char *string);//用来返回历史 ③typedef char *rl_compentry_func_t(const char *text, int state); ④char **rl_completion_matches(const char *text, rl_compentry_func_t *entry_func); 继续阅读 >>


陈文浩 18/07/30 20:45:15
/* 因为相乘顺序会影响标量的乘法大小,所以加括号的位置非常影响乘法结果的大小 */ #include<iostream> using namespace std; void matrix_chain_order(int *p,int m[][1000],int s[][1000],int n); void print(int s[][1000],int i,int j); int main() { int p[1000];//存储第一个行,和其他的列 cout <<"请输入要输入矩阵的个数:"; int num = 0 ; cin >> num; int row = 0,column = 0; cout <<"请依次输入矩阵的行和列:"; cin >> row >> column; //因为p[0]要存第一个矩阵的行,之后的p都是存矩阵的列 //这里我刚开始 继续阅读 >>


陈文浩 18/04/09 18:32:03
i= 0表示有序数组arr1的首元素,j = 未知,表示有序数组arr2的首元素 ①首先比较第一个有序数组arr1和第二个有序数组arr2第一个元素的大小 如果arr1[i] < arr[j],i++ 否则 index记住j的位置,index就是j变化之前的位置 ②如果arr2[j] < arr[i],证明后面的元素小于后面的元素,需要进行往前的置换,所以j++,但是要保证j++不能越界 ③进行了①和②之后,已经找到了需要置换两个数组的范围,使用swap交换 ④进行i下标的更新,因为i+j-index已经排序好了,所以i要加上j-index ⑤直到while(i < j &&j < 数组的长度)不成立,程序结束 #include <iostream> #include <vector> #include <algorithm> using namespace std; template <typena 继续阅读 >>


陈文浩 18/04/08 22:40:31
1. 递归实现归并排序 基本思想: 将待排元素分成大小大致相同的2个子集,分别对2个子集合进行排序,最终将排好序的子集合合并 就会得到一个排好序的集合 即为所求 设归并排序的当前区间是R[low..high],分治法的三个步骤是: ① 分解:将当前区间一分为二,即求分裂点 ② 求解:递归地对两个子区间R[low..mid]和R[mid+1..high] 进行归并排序; ③ 组合:将已排序的两个子区间R[low..mid]和R[mid+1..high] 归并为一个有序的区间R[low..high]。 递归的终结条件:子区间长度为1(一个记录自然有序)。 2) 具体过程如下图所示: /* 数组a[]为待排序数组,数组b[]用来存放已排好序的数 left、right分别为待排序数组最左端和最右端的下标 mid为数组下标的中点 */ (算法导论版是借助两个数组,这个例子是借助了一个数组) #include<i 继续阅读 >>


陈文浩 18/04/08 19:18:18
/* 切割绳子,每段绳子都有一个最大值,给定长度为n的绳子,如何切割让利益最大化 自底而上的方法,对于任何子问题,直至它依赖的所有子问题都解决,才会去解决它。 */ #include<iostream> #include<algorithm> #include<vector> using namespace std; vector<int> max_value(100,0);//当长度为n时,最大利益 vector<int> first_cut(100,0);//当长度为n时,切割一刀的位置 vector<int> price{0,1,5,8,9,10,17,17,20,24,30};//每段绳子的价值 void cut_rope(int n) { int max; max_value[0] = 0;//长度为0,值为0; for(int j = 1;j <= n;j++)//总长度 继续阅读 >>


陈文浩 18/04/07 21:03:04
子数组换位问题 设a[0:n-1]是一个有n个元素的数组,k(0<=k<=n-1)是一个非负整数。 试设计一个算法将子数组a[0:k]与a[k+1,n-1]换位。要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。 初步思考:最简单的方法就是循环(n-k-1)次,将a数组的末尾数字插入到a[0]之前。 具体做法: (1) 首先开辟一个额外空间temp用于存放每一次a数组的末尾数据。 (2) temp <- a[n-1] (3) 将a[0: n-2] 每个数据都依次向后移动一位赋值给a[1: n-1]。 (4) a[0] <- temp (5) 循环执行(2) -(4) 步 (n-k+1)次。 代价分析: 时间代价—— O((n-1)*(n-k+1)) 即O(n^2 继续阅读 >>


陈文浩 18/04/03 22:49:49
头文件#include<numeric> accumulate(first,last, init); first,last可以是数字也可以是字符串,将把init 和从 first 到last 指向的值进行累加,并返回累加得到的和 #include<iostream> #include<numeric> #include<vector> #include<string> using namespace std; int main() { int arr[] = {1,2,3,4,5,6}; int sum = accumulate(begin(arr),end(arr),0); cout <<sum<<endl; string word[] = {"1","2","3","4"}; vector<string> str(word,word+sizeof(wo 继续阅读 >>


陈文浩 18/03/06 17:03:38
今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。 要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列: 17126425374635 当然,如果把它倒过来,也是符合要求的。 请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。 注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。 思路就是for循环负责某个下标,n是负责下标之间的距离,每次i和i+n+1等于同一个值,就保证使用了两个一样的值 #include<iostream> #include<cstring> int arr[16]; int dfs(int n) { if(n > 6) return 1;//因为7距离已经确定,所以最大距离就是6 if(n == 4) n++;//因为当n=4,两者距离就是4,4的位置已经确定,所以跳过 int i = 0; fo 继续阅读 >>


陈文浩 18/03/05 22:53:49