摘要: 归并排序是一种利用了分治思想的一种算法,是我在白书上看到的一种高效的排序算法,因此学习一下,并在此做下总结,加深理解。(毕竟也不能老是用sort不是?)首先由此算法我了解到了一种分治三步法的一种概念(一直对于这些东西云里雾里啊T T)。划分问题,递归求解,合并问题。而归并排序则非常清晰地完成了这三步。划分问题便是想要尽可能的把数组分为两半,使之变为两个较小的问题。递归便是不断地将问题划分地更小。而合并便是问题的关键所在了。假设现在最初的两部分已经排序成功,那么A,B两集合必然是有序的。因此我们便可以贪婪地取两个数组中最小的数来构成一个新的集合,而这个集合便是排序好了的。如{1,5,7,8}与{ 阅读全文
posted @ 2014-02-22 20:14 ACalvin 阅读(346) 评论(0) 推荐(0) 编辑
摘要: 上次因为haipz组织的比赛中有道题必须用到KMP算法,因此赛后便了解了下它,在仔细拜读了孤~影神牛的文章之后有种茅塞顿开的感觉,再次ORZ。附上链接http://www.cnblogs.com/yjiyjige/p/3263858.html。对于整个KMP算法,最精髓的部分便是关于next数组的生成。一开始ruijia liu的书上贴上的代码感觉完全不能理解,但是看神犇的分析觉得似乎明白了什么故写下此文来理理思路。在整理思路之前首先记住一句话:next[j]表示的是当在str2[j]!=str1[i]时,j指针应该移向的位置。对于next[j]的还有一种理解:对于0到当前j这样一段字符串,是 阅读全文
posted @ 2014-02-19 22:18 ACalvin 阅读(185) 评论(1) 推荐(0) 编辑
摘要: 纠结1242很久了,查了题解才发现要优先队列才能成功http://blog.chinaunix.net/uid-21712186-id-1818266.html使人开窍之文章优先队列,已经不算是FIFO的队列了,而是一种以优先级(可以是值的大小等等)进行动态插入数值的一种“伪队列”,其中优先队列是用堆而优先队列中与BFS的关系便在于,BFS的出队便是代表着使用方法与队的方法差不多,(STL)接下来是代码与解析#include#include#includeusing namespace std;const int SIZE=300;int M,N;char map[SIZE][SIZE];in 阅读全文
posted @ 2014-02-04 19:58 ACalvin 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 很早之前就做过的题以前用并查集做的现在用DFS重做算是熟悉DFS吧#include#includeconst int size=1000;int graph[size][size];int visit[size];int cout;int n,m;void get_graph(){ memset(graph,0,sizeof(graph)); memset(visit,0,sizeof(visit)); int t1,t2; for(int i=0;i<m;i++) { scanf("%d%d",&t1,&t2); graph[t1][t2]=1; g 阅读全文
posted @ 2014-01-27 11:36 ACalvin 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 这个题坑了太久太久啊!!!!!贡献了得有30+WA才发现原来是因为在乘法中有溢出导致一直TLE啊。。。。但是到最后也不知道有个问题怎么解决的。就是在getp()中的num值的诡异的改变!#include#include#includetypedef long long LL;const int TON=20100501;const int max1=2000005;int p[max1],b[max1]={0},num=0;void getp(){ int i,j; for (i=4;i=rec) { ans+=n/rec; rec*=pp; } return ans;}//求出n!中质因子的 阅读全文
posted @ 2013-12-23 23:10 ACalvin 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 这次写的凸包用的是Graham scan算法就数据结构上只是简单地运用了一个栈#include#include#include//#define LOCALusing namespace std;const int max1=1000;typedef struct point{ int x; int y;}point;int cp(point a,point b,point c){ c.x-=a.x; c.y-=a.y; b.x-=a.x; b.y-=a.y; return (b.x*c.y-b.y*c.x)>0;}int cmp(point a,point b){ if(a.y!=b. 阅读全文
posted @ 2013-12-21 17:27 ACalvin 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 对于SG函数来说,sg[y]=x的意义为,x与y的输赢状态是相同的sg[y]=mex(y)的定义与n.p点的定义是相同的#include#includeusing namespace std;int SG[1001],f[20]={1,2};int flag[20];void getfibo(){ int i; for(i=2;i>m>>n>>p) { if(m==0&&n==0&&p==0) break; ans=SG[m]^SG[n]^SG[p]; if(ans==0) cout<<"Nacci" 阅读全文
posted @ 2013-12-21 12:33 ACalvin 阅读(168) 评论(0) 推荐(0) 编辑
摘要: #includeusing namespace std;int main(){ int n; int i,j; int a[100+5]; int ans,tmp,cnt; while(cin>>n&&n) { for(i=0;i>a[i]; ans=a[0]; for(i=1;i<n;i++) ans^=a[i];//求出所有堆的按位与,为后面做准备 tmp=cnt=0; //根据按位与的定义,与a【i】与所有按位与==除a【i】所有的按位与 //因此只要得到一个理想的值小于这个堆的张数,就一定可以取出如此多张使对方到达必败点 for(i=0;i< 阅读全文
posted @ 2013-12-19 17:01 ACalvin 阅读(196) 评论(0) 推荐(0) 编辑
摘要: #include#include#define LOCALusing namespace std;int m[10][10]={0};int num=0;int check(int row,int column)//检查当前状态下能否放置{ int i,j; if(row==1) return 1; for(i=1;i=1&&j>=1)对左上到当前点进行检查 { if(m[i][j]==1) return 0; i--;j--; } i=row-1; j=column+1; while(i>=1&&j<=8)//对当前点到又上进行检查 { if 阅读全文
posted @ 2013-12-18 17:50 ACalvin 阅读(211) 评论(0) 推荐(0) 编辑
摘要: #include#includeusing namespace std;int main(){ int c1[10000],c2[10000]; int i,j,k; int n; while(cin>>n) { memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(i=0;i<=n;i++) c1[i]=1;//对第一个括号内函数系数初始化 for(i=2;i<=n;i++)//从第二个括号开始进行括号合并(n个括号),循环多少次即要做多少次乘法 { for(j=0;j<=n;j++)//对第一个括号进行循环 阅读全文
posted @ 2013-12-11 21:53 ACalvin 阅读(219) 评论(0) 推荐(0) 编辑