摘要:
简单并查集的使用。1、判断是否存在回路。2、判断图是否连通。---------开始时我只考虑了是否有环,而没有考虑是否连通。CODE:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>usingnamespacestd;constintmaxn=100010;intp[maxn],rank[maxn];intflag,sign[maxn];//判断是否是连通图intfind(intx){returnp[x]==x?x:p[x]=find(p[x]);}void 阅读全文
摘要:
开始题目看错了,以为是求老朋友的个数,后来发现题目要求求新朋友的个数。筛选法。。。CODE:#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>usingnamespacestd;constintmaxn=32769;intvis[maxn]={0};intN,cnt;voidinit(intn,int&cnt){inti,j;cnt=0;memset(vis,0,sizeof(vis));for(i=2;i<n;i++)if(!vis[i]){i 阅读全文
摘要:
简单DFS。CODE:#include<stdio.h>#include<stdlib.h>#include<string.h>usingnamespacestd;intx,y;inttot;intn,m;charmaze[21][21];voiddfs(intx,inty,int&tot){if(x>=0&&y>=0&&x<n&&y<m&&maze[x][y]=='.'||maze[x][y]=='@'){tot++;maze[x 阅读全文
摘要:
简单模拟。注意数组别越界!CODE:#include<stdio.h>#include<stdlib.h>#include<string.h>usingnamespacestd;constintmaxn=65534;__int64prime[maxn];__int64save[maxn];intvis[maxn]={0};intcnt=0;voidinit(){__int64i,j;for(i=2;i<maxn;i++)if(!vis[i]){prime[cnt++]=i;for(j=i*i;j<maxn;j+=i)vis[j]=1;}retur 阅读全文
摘要:
贪心算法。贪心策略:假设田忌的马为A,齐威王的马为B。要使价值最大化的话,则有如下几种情况:1、使A中速度最次的马与B中速度最好的马比赛,使得B的价值损失最大。2、使A中速度最好的马与B中速度最好的马比赛,使得B中价值损失最大。3、如果A中速度最次的马与B中速度最次的马速度相等,则比较A中速度最大的马与B中速度最大的马的速度,有如下情况:(1)若大于,根据2知须A中速度最大的马与B中速度最大的马比赛。(2)若小于,则根据1知须A中最次的马与B中最好的马比赛。接下来根据上面的贪心策略就得到了具体的方案:1、A最快 > B最快:即A的最快能打败B的所有队员,为了后面着想,必然跟B的最快比。2 阅读全文
摘要:
简单题。用一个数组存放每个拦截系统的导弹能达到的最大高度,如果后继导弹超过所有拦截系统的最大高度,那么数组就增加。只要小于某一拦截系统的话,那么就更新最大高度。CODE:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>usingnamespacestd;#defineINF30001constintSIZE=1001;intsave[SIZE];intmain(){intN;intn;while(~scanf("%d",&N)){ 阅读全文
摘要:
一道扩展欧几里得模板的题,这几天刚好练习一下简单数论的知识。思路:由于X*A + Y*B = 1,所以一定有gcd(A,B) = 1;CODE:#include<stdio.h>#include<stdlib.h>#include<string.h>usingnamespacestd;voidex_gcd(__int64a,__int64b,__int64&d,__int64&x,__int64&y){if(!b){d=a;x=1;y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//ex_gcdi 阅读全文
摘要:
放假后回来第2天在网吧AC的第一道题。这是一道变形的扩展欧几里得算法题。由题知:n = A%9973 。设9973*y = n;设A/B = x,则A = B*x; 则题目可以转换为: B*x-9973*y = n;对于扩展欧几里得算法的使用还不熟练,要加强联系啦!~CODE:#include<stdio.h>#include<stdlib.h>#include<string.h>usingnamespacestd;intn,b;intex_gcd(inta,intb,int&x,int&y){if(!b){x=1;y=0;returna;} 阅读全文
摘要:
最小生成树与并查集的使用。第一次写最小生成树哦,还是Kruskal算法高效、简洁。CODE:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>usingnamespacestd;constintmaxn=5100;intv[maxn],u[maxn],w[maxn];//u,线段起始点。v,线段终点。w,权值。intr[maxn];//保存边序号,便于间接排序intp[maxn];//并查集intcmp(constinti,constintj)//间接排 阅读全文
摘要:
这是一个全裸的并查集,其实就是求有多少个不同的连通分量。第一次用并查集,理解的差不多了,接下来就是应用啦。CODE:#include<stdio.h>#include<stdlib.h>#include<stdlib.h>#include<string.h>usingnamespacestd;constintmaxn=1002;intp[maxn];//p用来记录父节点intrank[maxn];//rank用来记录节点数intfind(intx){returnp[x]==x?x:p[x]=find(p[x]);}voidUnion(intx,i 阅读全文