07 2012 档案
摘要: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}
阅读全文
摘要:第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]
阅读全文
摘要:#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
阅读全文
摘要:简单的。。。一遍。。。#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
阅读全文
摘要:匈牙利算法。。。我套模版。。。。还是不理解。。革命尚未成功,同志尚需努力。。。#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
阅读全文
摘要:不是很理解啊。。。。有点抄袭的成分。。。唉。。。#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...
阅读全文
摘要:#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)
阅读全文
摘要:#include<stdio.h>#include<string.h>#define MAX 9999999#define N 205int map[N][N];int vis[N];int d[N];int start,end,n,m;//n个村庄,m条路径void init(){ memset(map,MAX,sizeof(map)); memset(vis,0,sizeof(vis)); memset(d,MAX,sizeof(d));}void dijkstra(int s,int e){ int i,k,j,min; vis[s]=1; for(i=0;i&l
阅读全文
摘要:#include<stdio.h>#include<string.h>#define N 100+5#define MAX 9999int map[N][N];int d[N];int n,ans;void prim(){ int i,j,k,min; for(i=1;i<=n;i++) d[i]=map[1][i]; ans+=d[1]; d[1]=0;//进入最小生成树 for(i=1;i<=n;i++){ min=MAX; for(j=1;j<=n;j++){ if(min>d[j]&&d[j]!=0){ k=j; min=
阅读全文
摘要:#include<stdio.h>int fmax(int i,int j){ return i>j?i:j;}int main(){ int s1,s2,s3,s4,s5,s6; int sum,tp,tp2; while(scanf("%d%d%d%d%d%d",&s1,&s2,&s3,&s4,&s5,&s6),s1+s2+s3+s4+s5+s6){ sum=0; sum+=s6;//6*6的箱子; //s6=0; sum+=s5;//5*5的箱子,剩下的用1*1来填充 //s5=0; s1=fmax(0
阅读全文
摘要:详见(http://www.darkswordzone.com/?p=749)对于一个正整数n的划分,就是把n表示成一系列正整数的和,划分与次序无关。如一个正整数5,可以划分为:[5][4,1][3,2] [3,1,1][2,2,1] [2,1,1,1][1,1,1,1,1]将一个正整数n划分,共有多少种划分方式?上面的例子第一行,所有加数不超过5;第二行,所有加数不超过4;。。。。。。。第五行,所有加数不超过1.定义int fun(int n,int m)表示正整数n,所有加数不超过m的划分数目。那么1,n==1或m==1 时共有1种划分方式。2,n==m时 fun(n,m)=fun(n,m
阅读全文
摘要:#include<stdio.h>#include<string.h>#define N 100000+5int step,mod,seed;int flag;int f[N];int main(){ int i,j,k; while(scanf("%d%d",&step,&mod)==2){ for(i=0;i<=mod-1;i++) f[i]=0; seed=0; do { seed=(seed+step)%mod; f[seed]=1; }while(seed!=0); flag=0; for(i=0;i<=mod-
阅读全文
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>int n,side;//numint stick[270];bool vis[270];int ok;int cmp(const void *a,const void *b){ return *(int *)b-*(int *)a;}void DFS(int num,int len,int s){ int i; if(num==3){ ok=1; return; } if(ok==1)return; for(i=s;i<n;i++){ if(vi
阅读全文
摘要:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路 每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}。 注意f[i][v]有意义当且仅当存在一个前i件物品的子集,其费用总和为v。所以按照这个方程递推完毕后,最终的答案并不一定是f[N] [V],而是f[N][0..V]的最大值。如果将状态的定义中的“恰
阅读全文
摘要:#include<stdio.h>#include<string.h>//#define INF 99999#define N 1000+10int path[N][N];int vis[N];int start[N];int sum[N];//第i个农场最多有几头牛能到达int k,n,m;//k头牛;n个牧场(出发点);m条路void dfs(int s){ int i; sum[s]++; vis[s]=1; for(i=1;i<=n;i++){ if(path[s][i]==1&&vis[i]==0) dfs(i); } return ;}
阅读全文
摘要:简而言之就是一个人手中有num张牌,然后拿出一张,再看看剩下的牌中有没有比它大的,有的话就ans+1,也就是输了一局;AC代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 1005int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}int p1[N],p2[N];bool vis[N];int num,sum,ans;int peo;//peopleint main(){ int i,j,k,cou
阅读全文
摘要:此题讲的是N个人过河,每个人都有自己的过河时间,一条船只能承受2个人,所用时间为其中过河时间最多的,所以呢,想到有两种情况,第一种:过河时间最少的人来回接送其他人,第二种:过河时间最少和次少的人来回接送其他人,刚开始就觉得第一种时间必然是最少的,但是仔细想想,不然。因为第一种情况虽然单次过河时间少,但送人的次数要多,如第1个人(过河时间最少)接送第i人 dp[i]=dp[i-1]+time[0]+time[i]; 而第二种情况呢,虽然来回次数多,但是接送的人要多,如第1个人接第i-1个和第i个人,然后让第i-1个和第i个人一块过河,第2个人再接送第1个人。dp[i]=dp[i-2]+time[
阅读全文
摘要:KMP算法(http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html)在介绍KMP算法之前,先介绍一下BF算法。一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 举例说明: S: ababcababa P:ababaBF算法匹配的步骤如下 i=0 i=1 i=2...
阅读全文
摘要:#include<iostream>#include<cmath>#include<algorithm>using namespace std;#define N 50005int map[N];int n;bool cmp(int a,int b){ return abs(a)<abs(b);}int main(){ __int64 sum_t,used_t; int i,j,ans; while(cin>>sum_t>>n){ for(i=1;i<=n;i++) cin>>map[i];//scanf(&q
阅读全文
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAX 30struct g{ int x; int y;}path[MAX+100];const int d[8][2] = {{-1, -2}, {1, -2}, {-2, -1}, {2, -1}, {-2, 1}, {2, 1}, {-1, 2}, {1, 2}};//这里就处理好了字典序的问题,为什么?int map[MAX][MAX];int color[MAX][MAX];int p,q,ok;int out(int x,i
阅读全文
摘要:*贪心,符合最优子结构性质。5个月统计一次都亏空,那么有5种情况: 1、若SSSSD亏空,那么全年可能最大盈利情况为: SSSSDSSSSDSS 2、若SSSDD亏空,那么全年可能最大盈利情况为:SSSDDSSSDDSS 3、若SSDDD亏空,那么全年可能最大盈利情况为: SSDDDSSDDDSS 4、若SDDDD亏空,那么全年可能最大盈利情况为: SDDDDSDDDDSD 5、若DDDDD亏空,那么全年可能最大盈利情况为: DDDDDDDDDDDD*/#include<stdio.h>int main(){ double s,d,ans; w...
阅读全文
摘要:#include<stdio.h>#include<math.h>#define MAX 10105int prime[1300]={0},s[10105]={0};int isPrime(int n){ int i; for(i=2;i<=sqrt(1.0*n);i++) if(n%i==0) return 0;//0 is not prime return 1;//1 is prime}int main(){ int i,j,k,n,ans,sum; k=0; for(i=2;i<=MAX;i++) { if(s[i]==0) prime[k++]=i;
阅读全文
摘要:#include<stdio.h>#include<string.h>int main(){ int i,sum,temp; char ch[260]; while(1) { //scanf("%s",ch); gets(ch); if(strcmp(ch,"#")==0) break; sum=0; temp=1; for(i=0;i<strlen(ch);i++) { if(ch[i]>='A'&&ch[i]<='Z') sum+=(ch[i]-'A
阅读全文
摘要:题意:提供给许多的点,这些点的坐标位置全都知道,知道起点终点,求起点到终点最少经过几个点,并且两两之间不能超过一定的长度BFS广度优先搜索就是从起点开始依次访问与之邻接的符合条件的点,然后再按照顺序访问这些邻接的点的符合条件的邻接点。。。。如此下去;BFS能做到求图的最短路径,但是要保证这些路径都相等。通常用队列来实现Q={起点s}标记s已被访问while (Q非空) { 取Q队首元素u; u出队; 所有与u相邻且未被访问的点进入队列;//可以在这里对所要求的目的进行处理标记u为已访问; } #include<cstdio>#include<cstdlib>#inclu
阅读全文
摘要:#include<stdio.h>#include<stdlib.h>struct g{ int l; int w; bool t;}sticks[2505];int cmp(const void *a,const void *b){ struct g *c=(g *)a; struct g *d=(g *)b; if(c->l!=d->l) return c->l-d->l; else return c->w-d->w;}int main(){ int i,j,t,n; int ans,temp; scanf("%d&qu
阅读全文
摘要:(1) struct{ int x; int y; }test1; 好,定义了 结构 test1,test1.x 和 test1.y 可以在语句里用了。(2) struct test {int x; int y; }test1; 好,定义了 结构 test1,test1.x 和 test1.y 可以在语句里用了。与 1 比,省写 了 test(3) typedef struct test {int x; int y; }text1,text2; 只说了 这种结构 的(类型)别名 叫 text1 或叫 text2真正在语句里用,还要写:text1 test1;然后好用 test1.x test.
阅读全文
摘要:用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb;//这多数不符合我们的意图,它只声明了一个指向字符变量的指针,//和一个字符变量;以下则可行:typedef char* PCHAR;PCHAR pa, pb;这种用法很有用,特别是char* pa, pb的定义,初学者往往认为是定义了两个字符型指针,其实不是,而用typedef char* PCHAR就不会出现这样的问题,减少了错误的发生。用途二:用在旧的C代码中,帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名
阅读全文
摘要:1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:#define PI 3.1415926程序中的:area=PI*r*r 会替换为3.1415926*r*r如果你把#define语句中的数字9 写成字母g 预处理也照样带入。2)typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,但是You cannot use the typedef specifier inside a function definition。3)typedef int * int
阅读全文
摘要:import java.math.BigInteger;import java.util.Scanner;public class Pone{ public static void main(String args[]) { Scanner cin=new Scanner(System.in); //String a1=new String(); int a1=0; String temp=new String(); BigInteger a=BigInteger.valueOf(a1); while(true) { temp=cin.next(); if(temp.eq...
阅读全文