- 博客(156)
- 资源 (1)
- 收藏
- 关注
原创 Y combinator 的推导过程
Y combinator 的推导过程最近在看《暗时间》,书中有Y组合子的推导过程,初看时很难理解,这里记录一下加深记忆,我们使用Scheme语言的语法。我们知道Scheme中可以这样定义递归函数(define (func n) (if (= n 0) 1 (* n (func (- n 1)))))但是我们知道define这个函数只起到了一个语法糖的效果,再对
2015-02-19 22:38:45
686
原创 平方根的两个求法
最近在复习MIT的微积分重点公开课。对泰勒级数有了重新的认识。平方根的求法1:使用牛顿迭代double sqrt_(double x) { double g=x; while(ABS(g*g-x)>0.000001) { g=(g+x/g)/2; } return g;}平方根的求法
2014-02-11 20:08:21
423
原创 CF 380A Sereja and Prefixes binary search, brute force
#include#include#define ll long long intusing namespace std;int m,n;ll range[100001];ll num[100001];ll pp[100001];ll bin_search(ll rt){ ll high,low,mid; mid = -1; high = m - 1; while(mid
2014-01-21 22:00:55
275
原创 LKD Interrupts and Interrupt Handlers
Interrupts硬件发送信号给进程产生中断,中断是异步产生的。中断由中断请求线(IRQ)来区分,IRQ是一个数值,一般来说0代表计时器,1代表键盘。而异常一般是同步发生的,所以也叫做同步中断,当处理器执行指令时会产生异常:除0,页错误等等,当然还有前面讲过的系统调用。Interrupt Handlers中断处理函数也叫做中断服务程序,每个设备产生的中断都有一个相关的中断处理函数
2014-01-09 16:48:43
159
原创 CF 368B - Sereja and Suffixes
预处理一下就好了,一开始题目看不懂,怎么回事,做A,B的感觉太简单。C又太难T_T#include#includeusing namespace std;int n,m;int a[100001];int l[100001];int flag[100001];int diff;int ans[100001];int main(){ cin>>n>>m; diff=0;
2014-01-09 16:40:05
373
原创 CF 378B Semifinals implementation, sortings, two pointers
类似归并排序1.先给两组前n/2个位都置1。2.按归并顺序依次置1。#include#includeusing namespace std;int n;int a[100001];int b[100001];char ans1[100001];char ans2[100001];int main(){ cin>>n; memset(a,0,sizeof(a));
2014-01-09 15:48:13
265
原创 CF 379C New Year Ratings Change
先根据rate排序,去重,注意可能前面去重后的结果影响到后面的值,因此WA了一次。然后在按序列排序回来。#include#includeusing namespace std;int n;struct dd{ int num; int val;}dad[300001];bool cmp1(struct dd a,struct dd b){ return a.val<b.
2014-01-09 15:09:07
276
原创 CF 357A 水题
HDU实在切不下去了,换个地方战。CF有提供数据什么的真是太棒了。题意,给你M个数字,表示第有Ci个人得i分,要求把这组人分成两组,每组人数都满足大于等于x或者小于等于y。求满足分组条件的分数划分点。。先求出所有数的和然后从头开始遍历比较寻找到第一个可行答案就行了#includeusing namespace std;int m;int c[101];int x,y;
2014-01-09 10:21:46
246
原创 LKD System Call
SyscallsSystem Call HandlerSystem Call ImplementationSystem Call Context
2014-01-08 14:15:20
113
原创 LKD Process Scheduling
Multitasking多任务操作系统一般有两种,一种是抢占式另一种是非抢占式。在抢占式操作系统中,由调度器决定什么时候一个进程开始运行和终止运行。在非抢占式操作系统中,一个进程一旦开始运行就只能由它自己自愿地终止。linux和现在大多数的操作系统都是可抢占的多任务操作系统。Linux's Process Schedulerlinux调度器的发展: O(1)调度器 =>
2014-01-08 14:03:16
223
原创 LKD Process Management
The Process1.process 进程不仅仅只是一个程序段,还包括打开的文件,收到的信号,进程状态,地址空间,一个或多个运行线程,保存全局变量的数据段等等2.thread线程拥有独立的PC,栈以及一组寄存器。linux内核是调度线程而不是进程,因为linux不区分线程和进程,线程只是一种特殊的进程。3.fork(),exec(),wait(),waitpid()进程
2014-01-07 16:13:49
334
转载 CSAPP lab. proxy
把别人做的加了点中文注释然后看了一遍,感觉网络编程和并行编程这块有好多东西得学。/* * proxy.c - CS:APP Web proxy * * TEAM MEMBERS: * Andrew Carnegie, ac00@cs.cmu.edu * Harry Q. Bovik, bovik@cs.cmu.edu * * A simple web
2014-01-04 18:40:59
1355
转载 CSAPP lab. assumulator and assembler
两个关键的c文件实现了一个Y86模拟器和一个Y86汇编器Y86模拟器源代码:/* Instruction set simulator for Y86 Architecture */#include #include #include "y86sim.h"#define err_print(_s, _a ...) \ fprintf(stdout, _s"\n", _a
2014-01-02 19:08:50
782
原创 CSAPP lab. buf
复习一章,做一个lab..之前做了bomblab之后再做这个似乎会入手了。。Level 0:objdump -d bufbomb > bufbomb.txt 之后再里面找到 getbuf这个函数08048ca4 : 8048ca4: 55 push %ebp 8048ca5: 89 e5
2014-01-01 21:21:16
272
原创 函数malloc一个简单的实现
网上对sbrk到底是system call 还是 library function说法不一这里通过调用sbrk实现了一个简略的malloc函数,用双向链表管理内存块,内存块的分配用了首次适应算法。据说linux源码里又插了一个红黑树数据结构将首次适应算法改进为最佳适应,好像很厉害的样子。#include#include/**************************
2013-12-21 15:08:20
591
原创 HDOJ 2438 三分法+计算几何
车子过弯问题#include#include#define PI (acos(-1))using namespace std;double x,y,l,w;double gety(double angle){ return l*cos(angle)+w/sin(angle)-x/tan(angle);}int main(){ while(cin>>x>>y>>
2013-12-18 19:33:05
336
原创 HDOJ 2298 三分法求凸函数极值
二分法作为分治中最常见的方法,适用于单调函数,逼近求解某点的值。但当函数是凸性函数时,二分法就无法适用,这时三分法就可以“大显身手”~~ 如图,类似二分的定义Left和Right,mid = (Left + Right) / 2,midmid = (mid + Right) / 2; 如果mid靠近极值点,则Right = midmid;否则(即midmid靠近极值
2013-12-18 17:46:57
345
原创 HDOJ CUP 二分求截锥体高
#include#include#define PI 3.1415926535898using namespace std;double Case,T,r,R,H,V,VT;int main(){ cin>>Case; while(Case--){ cin>>r>>R>>H>>V; double T,_r,_V; if(r==R){ printf("%.6lf\
2013-12-16 14:41:45
311
原创 HDOJ 1597 不知道属于什么的水题
假设:S1 = 1S2 = 12S3 = 123S4 = 1234.........S9 = 123456789S10 = 1234567891S11 = 12345678912............S18 = 123456789123456789..................现在我们把所有的串连接起来S = 1121231234....
2013-12-15 22:24:10
435
原创 HDOJ 2899 求极点+二分
#include#include#define Min(a,b) (a<b?a:b)using namespace std;/* F(x) = 6*x^7 + 8*x^6 + 7*x^3 +5*x^2 -y*x * F(x)'= 42x^6 + 48*x^5 + 21*x^2 + 10*x = y */double get_sum(double x){ return
2013-12-13 19:54:58
300
原创 HDOJ 2199 二分
函数 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y 在X在[0,100]递增,直接二分求解#include#includeusing namespace std;/* * 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y * 32*x^3 + 21*x^2 + 4*x */double get_sum(
2013-12-13 19:03:51
315
原创 HDOJ 3496 二维背包
题意:有n个物品,每个物品有一个val[i]以及一个时间限制t[i],求再最大时间限制为L时,选择M个物品的最大sumval。这道题背包的第二维隐藏在只能从n个物品种选择M个这个限制,另一个就是总的时间限制L。我们可以看成每个物品占用一个可选容量和一个时间限制。可选容量恒为1,而时间限制维t[i]。状态转移方程dp[k][i][j]=Max(dp[k-1][i-1][j-t[k]]+v
2013-12-10 14:25:32
326
原创 HDOJ 2545 0/1背包
对所有价格进行排序,将价值最大的留下来最后用必然可以构造对低价格,对前面n-1的菜模拟0/1背包求出#include#include#include#define Max(a,b) (a<b?b:a)using namespace std;int n;int p[1001];int m;bool dp[50001];bool cmp(int *a,int *b){
2013-12-07 21:21:16
284
原创 HDOJ 1712 动态规划
dp[i][j]表示前i门课在j天内所能获得的最大收益转移方程dp[i][j]=Max(dp[i-1][j-k]+A[i][k])注意优化空间时迭代的方向(多重背包和0/1背包的区别)#include#include#define Max(a,b) (a<b?b:a)using namespace std;int N,M;int A[101][101];
2013-12-06 22:45:55
306
翻译 完全不懂Minix3---1
2.5. Overview of Processes in MINIX 3Having completed our study of the principles of process management, interprocess communication, and scheduling, we can now take a look at how they are applied
2013-12-03 20:23:21
434
原创 HDOJ 1171 多重背包+优化
关键是思路,为的使两个分组中的值最接近,则只要求出可以取到的最接近最大值一半的那个数,因此将sum/2作为上线状态转移方程dp[i]=Max(dp[i-w[j]]+v[j],dp[i])由于这里没有v数组,因此退化成bool型的值#include#include#define Max(a,b) (a<b?b:a)using namespace std;bool dp[25
2013-12-03 18:58:20
298
原创 CSAPP 程序性能优化
通过比较不同的7个combine函数,理解一些优化程序的方法优化2,优化3: 消除过程(函数)调用的开销,将vec_length函数提取到循环外,以及定义一个新的函数get_vec_start直接访问数组,要注意一点的是,新函数严重破坏了vec_rec类型的封装性,模块性,但是获得了性能上的提高。优化4:消除存储器引用(减少访问内存的次数),函数中每次调用*dest都会访问一
2013-11-21 12:54:17
631
原创 APUE2 1.1-1.6
#include "apue.h"#include intmain(int argc, char *argv[]){ DIR *dp; struct dirent *dirp; if (argc != 2) err_quit("usage: ls directory_name"); if ((dp = ope
2013-11-17 22:37:52
464
原创 HDOJ 2604 递推
给你一个长度为L的由m和f两种字母组成的字符串,定义存在fmf以及fff子串的都是不符合要求的串,问长度为L的符合要求的串有多少个那么当L=1,时,dp[1]=1,L=2时,dp[2]=4,L=3时,dp[3]=6考虑当L=n时的情况,将原问题拆分为两个子问题1.最后一个字符为m 。此时,只要前面长度为n-1的串符合要求,则当前长度为n串必然符合要求。2.最后一个字符为f。此时,存
2013-11-15 20:51:24
301
原创 HDOJ 1131 组合数学
问n个不同的节点可以组成多少种不同的树首先考虑对于相同的n个节点可以形成多少种树,设DP[N]为N个节点的情况,我们分别考虑左右子树的情况,假设左子树有i个节点,那么相对的右子树就存在N-i-1个节点,那么就有DP[N]=DP[i]*DP[N-i-1] i=0.1.2....N-1这是节点都相同的情况,那么,对于任意一个由k个节点组成的其中一种树,当这k个节点都不相同时,考虑k的全排
2013-11-15 17:08:17
305
原创 CSAPP lab. binary bomb 二进制炸弹
在 http://csapp.cs.cmu.edu/public/labs.html 下了个32位的bomb文件。。使用-objdump -d bomb得到反汇编的代码= =一大坨的完全被吓到了有木有然后看到有main函数还有6个phase,于是抓住重点开始研究call 之后如果ret出来再调用就表示拆蛋。。!弹成功了不然就会爆炸。所以我们深入到每个ph
2013-11-15 16:18:53
2037
原创 HDOJ 1021 求fibonacci数的高4位
题目给定一个数n,非常大,n个这样的int型会超memory,要求fib[n],超过四位的数只要输出前4位首先考虑传统的O(n)算法求fibonacci数,显然先求出所有数然后保存下来会超过题目要求的memory,这种方法不适用,即我们无法将数保存下来然后输出,因此只能对每个要求的n,单独求出前四位,因此考虑直接使用公式,当然直接代公式是不可能,从只需要输出前4位这个条件入手,
2013-11-11 22:54:14
347
原创 SICP读后总结+对函数式编程的理解
花了两个月的时间瞄完了SICP,完成了一到三章的大部分习题,第四章照着书上实现了一个元循环解释器,以及一个查询系统,第五章也照着书上模拟了一下机器语言,最后一节编译没有细看,现在做一下总结。整本书依次介绍了过程抽象、数据抽象、环境模型、解释器、编译器一、过程抽象1.正则序先将参数展开然后规约,应用序先对参数求值,然后将值代入,特别要注意的著名的Y combinator只适用于正
2013-11-10 22:24:40
744
原创 git的使用方法
之前已经建立了ssh key并添加到了github中,因此现在直接使用ssh -T git@github.com 命令连接到github比如现在要把本地的SICP习题上传至github上那么先cd到习题目录所在位置使用git init 命令初始化git仓库然后在目录中进行想要的文件添加和修改git add 添加文件git commit -m "version"
2013-10-15 21:40:23
534
原创 HDOJ 3068 最长回文子串O(n)
求一个字符串中的最长回文长度的O(n)算法,这个算法有一个名字Manacher。具体原理与实现:假设存在一字符串 waabwswfd我们将在该字符串各字符之间以及边缘各插入一个特殊字符#构造新的字符串 #w#a#a#b#w#s#w#f#d ,这样做的好处是可以不用区分奇数串还是偶数串。并定义变量P[i]为新字符串中以第i个字符为中心的回文串其中心至边缘的距离,那么P[
2013-10-15 11:11:05
358
原创 半年+没有更新
这段日子在啃CLRS以及C++ PRIMER的电子书,重装系统导致C++Primer上的各种笔记全部丢失。。。真是心痛。已入手concrete mathematics .c++ primer fifth edition 以及sicp的实体书,数模以及CLRS结束后就开始给blog充电
2013-09-08 14:57:05
288
原创 POJ3017 单调队列+线段树+DP
题意:给你一串长度为N的数字,和另一个单独的数字M,现在要把串切割,使每一连续部分的和都小于等于M,要求各部分最大值的和最小。朴素的DP转移方程DP[i]=Min(DP[j]+Max(A[k]) 0j且Sum[i]-Sum[j-1]复杂度为O(n^2)需要优化可以看到,求Max(A[k]) 可以转化成用单调队列维护的问题,对于被条件(Sum[i
2013-01-25 16:48:53
180
原创 POJ2823 单调队列
先定义单调队列: 顾名思义是单调递增或单调递减的队列,队首为队列的最大值或最小值。可以进行的操作:1.队首出队2.队尾进队出队题意: 告诉你一组数组的长度,以及一个固定的区间M。例如 A[ 1.......N] ,固定区间长度为M,问自i=1时起区间A[i.....i+M-1] 中的最大值依次是多少思路:区间最值问题可以用线段树来解决,但是线段树的访问存在对一
2013-01-25 00:46:04
248
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人