摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>struct tree{ int lev; struct tree*next[26];};tree root;char str[12];void creat_tree(char *str){ int i,j,len,id; len=strlen(str); tree *p=&root,*temp; for(i=0;i<len;i++){ id=str[i]-'a'; if(p->next[id]==NULL){ tem 阅读全文
posted @ 2012-08-03 13:19 xxx0624 阅读(294) 评论(0) 推荐(0) 编辑
摘要: 题目意译:有n个人围在桌子前面喝茶,等大家都坐定后,必然有个前后左右顺序,比如:a左边b,b左边c,依次类推,最后一个假设是g,那么他左边必然是a。形成一个圆环。现在有个规则,规定每次只能相邻两个人进行交换位置。请问要经过多少次交换,才能让之前位置交换(b左边a,c左边b,a左边是g)思路:大家都清楚假定是一排的情况下:a b c d e f g如果位置交换后:g f e d c b a需要经过n*(n-1)/2次交换(冒泡法进行交换)现在情况是环形,试问能不能将环拆分成两个线性,然后进行交换,再拼接在一起。举例如下:a b c d e f g(g后面又是a)如果分成a b c,d e f g 阅读全文
posted @ 2012-08-03 10:56 xxx0624 阅读(269) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>int main(){ int dp1[30005],dp2[30005],a[30005]; int n,j,i,k,max; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); if(a[1]==1) dp1[1]=1; else dp1[1]=0; for(i=2;i<=n;i++){ if(a[i]==1) dp1[i]=dp1[i-1]+1; else dp1[i]=dp1[i-1]; } if(a[n]==2) dp 阅读全文
posted @ 2012-08-02 10:08 xxx0624 阅读(233) 评论(0) 推荐(0) 编辑
摘要: View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<queue> 5 #include<algorithm> 6 #define N 36 7 using namespace std; 8 char map[N][N][N]; 9 int vis[N][N][N];10 int dx[6]={0,-1,0,1,0,0};11 int dy[6]={-1,0,1,0,0,0};12 int dz[6]={0,0,0,0,1,-1} 阅读全文
posted @ 2012-07-29 14:11 xxx0624 阅读(401) 评论(0) 推荐(0) 编辑
摘要: 第01讲 什么是树状数组?树状数组用来求区间元素和,求一次区间元素和的时间效率为O(logn)。有些同学会觉得很奇怪。用一个数组S[i]保存序列A[]的前i个元素和,那么求区间i,j的元素和不就为S[j]-S[i-1],那么时间效率为O(1),岂不是更快?但是,如果题目的A[]会改变呢?例如:我们来定义下列问题:我们有n个盒子。可能的操作为1.向盒子k添加石块2.查询从盒子i到盒子j总的石块数自然的解法带有对操作1为O(1)而对操作2为O(n)的时间复杂度。但是用树状数组,对操作1和2的时间复杂度都为O(logn)。第02讲 图解树状数组C[]现在来说明下树状数组是什么东西?假设序列为A[1] 阅读全文
posted @ 2012-07-27 19:26 xxx0624 阅读(7210) 评论(0) 推荐(3) 编辑
摘要: #include<cstdio>#include<queue>#include<iostream>#include<cstdlib>#include<algorithm>#define N 800000+5using namespace std;struct g{ int cost; int date;}a[N];int n;int cmp(const void *a,const void *b){ return (*(struct g *)a).date>(*(struct g *)b).date?1:-1;}int main 阅读全文
posted @ 2012-07-23 20:32 xxx0624 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 简单的。。。一遍。。。#include<stdio.h>#define N 30000+5int n,m,ans;//n个人,m个团体int father[N];int sum[N];int find_f(int x){ if(father[x]==x) return x; else { father[x]=find_f(father[x]); } return father[x];}void u(int x,int y){ int fx,fy; fx=find_f(x); fy=find_f(y); if(fx==fy) return ; if(sum[fx]>=sum[f 阅读全文
posted @ 2012-07-21 18:48 xxx0624 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 匈牙利算法。。。我套模版。。。。还是不理解。。革命尚未成功,同志尚需努力。。。#include<stdio.h>#include<string.h>#define MAX 505bool map[MAX][MAX];//表示男女生是否相连bool vis[MAX];//表示是否访问过y里的男生int link[MAX];//link[j]表示y中的j元素当前与x中连接的元素int m,n;bool searchPath(int u){ int v; for(v=1;v<=n;v++){ if(map[u][v]&&vis[v]==false){ v 阅读全文
posted @ 2012-07-21 16:19 xxx0624 阅读(528) 评论(0) 推荐(0) 编辑
摘要: 不是很理解啊。。。。有点抄袭的成分。。。唉。。。#include<stdio.h>#include<string.h>//#define N 1000#define MAXN 100010int c[MAXN],a[MAXN];int lowbit(int x)//计算lowbit{ return x&(-x);}void add(int i,int val)//将第i个元素更改为val{ while(i<=MAXN) { c[i]+=val; i+=lowbit(i); }}int sum(int i)//求前i项和{ int s=0... 阅读全文
posted @ 2012-07-21 16:16 xxx0624 阅读(415) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#define N 10000000+5int father[N],sum[N];int ans;int find_father(int x){ if(father[x]==x){ return x; } else{ father[x]=find_father(father[x]); } return father[x];}int fmax(int i,int j){ return i>j?i:j;}void u(int x,int y){ int fax,fay; fax=find_father(x); fay=find_father(y) 阅读全文
posted @ 2012-07-21 16:14 xxx0624 阅读(571) 评论(0) 推荐(0) 编辑