摘要:给出1到n的数字排列,可以在中间加上'+','-',' '期中,空格表示这个由这几个数字组成的一个整数,如1 2 4等价于124由于数据n比较小,所以可以直接用dfs来枚举即可。 1 /* 2 ID: xvoid191 3 LANG: C++ 4 TASK: zerosum 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <algorithm> 9 #include <string>10 using namespace std;11
阅读全文
文章分类 - 各种搜索
摘要:给出一些点坐标,问能组成多少个正方形。。。题目很简单,数据量不是很大,最容易想到的是,由于一个正方形一条边确定后,即两个点,可以根据三角形全等计算出另外两个点坐标根据此,可以把坐标由左下角向右上角的大小进行排序,然后枚举每两个点,进行bsearch另外两个点,找到cnt++,由于一个正方形可能被两组对边各计算一次,所以结果除以2即可。。。这题bs浪费时间较多,还有个办法就是把坐标hash了,借鉴了一个别人代码,用的思想是用点到源点的距离进行hash,然后再拉链解决冲突。。。bsearch枚举#include<stdio.h>#include<string.h>#incl
阅读全文
摘要:特别好的一道综合题目,题木很简单,给出几段木棍,两端的颜色,问你是否能够组成一根长木棍,要求相接处用同一种颜色....首先要把颜色字符串给离散化标号,用字典树动态建立,然后标号后,再判断欧拉路之前要先用并查集判断连通性,基本就是这个思路了#include<iostream>#include<cstring>using namespace std;char clr1[11],clr2[11];int p[500010];int r[500010];int rec[500010];int num=1;struct node{ int id,i; node*next[27];
阅读全文
摘要:给出一个苹果树,是一棵树,在每个节点出有一个苹果,然后根节点标号总为1,给出一棵树,上来都有苹果然后给出一些节点上的操作,操作是进行相反状态有和没有苹果的改变,给出一些询问操作,就是某个节点的子树上所有苹果,包括自己这题说实话,今天下午耗时最大理解时间最长的题了。。。。首先用邻接表存储这棵树,然后由于这棵树的节点标号是任意的,所以想到用dfs遍历树一遍后按照访问的次序给树标号,当然也能够求出某个节点当前的号low[x],和最后一颗字数节点的号high[x],得出一个区间,这个区间上的苹果数就是x节点和子树的苹果数然后就对一个苹果的新标号进行update这题就解决了。。。。。有个小问题就是如何判
阅读全文
摘要:这个题比较难点,不过记得之前刚接触树状数组时候做过这题,当时搞明白了,可是今天看了后,又没点思路了。。。后来看了代码才明白题目有两种操作,插入一个数,询问区间内有插入数的个数由于数据比较大,所以也不能用简单的模版来套,依旧要离散化啊啊先把所有的操作数给存储起来,包括询问的数,放一个数组里,然后排序之,另外按照操作的顺序再把数据放到队列里一份之后从队列取数据,二分当前数据在数组里的下标,然后用下标来更新操作另外需要注意的是,数组里不光存储了插入的数,询问操作的数也要放进去,这样才能给这俩数分配下标后进行get操作ps:这里用了下系统函数bsearch,感觉不错,不过也手写了一个二分,时间当然还是
阅读全文
摘要:有1-N个城市,并且给出城市之间的长度,还有花费,注意,相同城市之间可能有好几条道路,问最后花费不超过K,从城市1到N的最短距离直接暴力dfs,然后再稍微剪枝一下就可以过,关键是处理两个城市间的多条路,在这里用邻接表处理,在搜索时候如果已经找到一组长度,在循环时候若当前长度小于已经找到长度,就不用再dfs了,还有就是注意标记数组#include <stdio.h>#include <string.h>#define MIN(a,b) (a)<(b)?(a):(b)#define N 105#define inf 1e8struct city{ int ed,len
阅读全文
摘要:题目大意,给出几个信号站的相连关系,任意两个相连的信号站不能用一个channel,问最终至少用几个channel可以让所有信号站发新号这个是经典的四可着色定理,用dfs来暴力搜索,每次选定一个颜色后依次往下dfs直到所有的顶点都满足PS:唉dfs的题目,每次看着答案感觉特别有感觉,但是自己写的时候总不知道如何下手,多练习吧#include <iostream>#include <cstdio>#include <cstring>using namespace std;bool map[26][26];int n;int color[26];int color
阅读全文
摘要:给出一个地图,X标记不可走,D表示门,S表示起点,每次走上下左右走一个点,问你在所给的时间,刚好走到D么?并且每个点不能重复走最近看了不少DFS,感觉没神马长进啊........#include <stdio.h>#include <stdlib.h>#include <iostream>#include <string.h>#include <math.h>#include <queue>using namespace std;char map[10][10];int n,m,Time,flag,aa,bb;int di
阅读全文
摘要:给出几个景点,然后问你从家出发,不重复经过景点,并且全部游览完再回家么?就是求是否有汉密尔顿回路,在这里在复习下欧拉图还有汉密尔顿的几个概念,全面进入图论备战计划中图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。 具有欧拉回路的图称为欧拉图(简称E图)。欧拉回路的判断 一下判断基于此图的基图连通。无向图存在欧拉回路条件 一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数。有向图存在欧拉回路条件 一个有向图存在欧拉回路,且所有顶点的入度等于出度混合图存在欧拉回路条件 要判断一个混合图G(V,E)(既有有向边又有无向欧拉回路的判断 一下判断基于此图的基图连通。无
阅读全文
摘要:给出要交换的卡片价值n,然后给出m个卡片,每个卡片的价值和数目,问你能有多少种来组成一个ndfs往后搜索,dfs(left,index)从index往后搜,left是剩余的价值,if(left==0)种类++;最蛋疼的是输出格式,让我纠结了一小会儿,PE了3次#include <stdio.h>#include <string.h>struct cost{ int v,cnt; }costs[20];int val,n,num;void dfs(int left,int index){ if(left==0){num++ ;return ;} for(int i=ind
阅读全文
摘要:给出一堆木棒,是否能组成一个正方形首先相加/4 是否是整数,不是的话直接输出no,其次看每个数,如果有大于aver的依然break掉输出no然后把木棒从大到小排序dfs(index,sum,num)index 从当前的数组下标开始往后dfs,sum当前已经加到的和,num是当前已经搜到边数#include<stdio.h>#include<stdlib.h>#include<algorithm>using namespace std;int aver,flag,n,a[30],visited[30]={0};int cmp(int x,int y){ ret
阅读全文
摘要:给出一个n,k,再给出的n个数中,输出所有的可能使几个数的和等于kSample Input4 6 4 3 2 2 1 15 3 2 1 1400 12 50 50 50 50 50 50 25 25 25 25 25 250 0Sample OutputSums of 4:43+12+22+1+1Sums of 5:NONESums of 400:50+50+50+50+50+50+25+25+25+2550+50+50+50+50+25+25+25+25+25+25明显的DFS,这个dfs方程让我纠结啊,递归的我头都大了,但是看下答案稍微来点灵感了,在这里dfs函数方程要有哪些参数?首先要从
阅读全文
摘要:给出一个棋盘,上面#位置标记可放,然后再给出一个数k,表示要放k个棋子,要求没有两个在同一行和同一列上,输出所有情况个数dfs问题,dfs(d,k),表示在第d行上放第k个棋子#include<stdio.h>#include<string.h>char ch[10][10];int f[10],cnt,n;int DFS(int r,int k){ int j; if(k==0) { cnt++; return cnt; } if(r>=n) return cnt; for(j=0;j<n;j++) { if(!f[j]&&ch[r][j]
阅读全文
摘要:给你一个二维数组,.表示可以到达,#表示障碍,@表示起始位置,问你能到达的最大地点有多少个,每次只能走上下左右直接dfs,中间加了很多状态标记用来剪枝,但是发现没用上,直接也可以过,数据量小#include <stdio.h>#include <string.h>#define N 21int w,h,sx,sy;char map[N][N];bool used[N][N];int dir[][2]={{-1,0},{0,1},{1,0},{0,-1}};int dp[N][N];int dfs(int x,int y){ int xx,yy,sum=0; if(use
阅读全文
摘要:给出一个序列,然后让你求连续序列和的平均数大于所给的数a可以先把输入的数减去a,那么就是求连续序列的和大于0即可,接下来把数组suni]就是前i项的和,那么s[j]>s[i]就可以满足因此就是求sum的逆序数,可以用归并排序来求,直接上代码慢慢看吧./*Source CodeProblem: 1285 Username: void Run Time: 233MS Memory: 1484K Language:C++ JudgeStatus: Accepted */#include<iostream>#include<cstdio>#include<memor
阅读全文
摘要:现在做这些题就当水题来做了,想当初拿来别人的代码看着就费劲,唉,这东西还是熟能生巧,继续加油ac吧题目要求,一个象棋棋牌,给出起始位置,有个马,走日子,最少走几步能走到终止位置上简单的bfs用队列模拟,不过需要注意的是8个方向可以用一个数组来循环使用#include <stdio.h>#include <stdlib.h>#include <queue>#define N 301using namespace std;int map[N][N];bool used[N][N];int len,stx,sty,enx,eny;queue<int>Q
阅读全文
摘要:给出一个牛的坐标n,然后他可以前走一步或者倒退一步,或者直接走到2*n的位置上直接想到的就是bfs,用一个数列来模拟,先找当前一步能到的地方,放到数组里,之后一层一层找#include <stdio.h>#include <string.h>#include <queue>#include <iostream>#include <algorithm>#define N 100001using namespace std;int dis[N];bool used[N];queue<int>Q;int init(int n,i
阅读全文
摘要:一根木棒受热会拱起来,现在给你原始长度和拱起来的弧形长度,然你算出鼓起的中点到水平的距离假设加热后的长度是L,原始是l,则角度a=L/R,R=l/(2*sin(a/2));然后得到2*L/l=a/sin(a/2)用二分求出a的值,最后用公式得出结果#include <iostream>#include <cmath>#include <algorithm>using namespace std;int main(int argc, char* argv[]){ double N,C,L; while(scanf("%lf%lf%lf",&
阅读全文
摘要:从起点房间1出发,初始有100的能量,达到每个房间会增加或者消耗一定的能量,问能否以大于0的能量到达点n(中间过程的能量也必须是大于0的)。并且每个房间可经过多次。Bellman-Ford算法简介:首先,对每个点相连的边进行记录,然后依次进行松弛操作,即从源点s可达的所有顶点如果 存在最短路径,则这些最短路径构成一个以s为根的最短路径树。Bellman-Ford算法的迭代松弛操作,实际上就是按顶点距离s的层次,逐层生成这棵最短路径树的过程。 在对每条边进行1遍松弛的时候,生成了从s出发,层次至多为1的那些树枝。也就是说,找到了与s至多有1条边相联的那些顶点的最短路径;对每条边进行第2遍松弛的时
阅读全文
摘要:给出几个单词,问你是否能首位相接起来,按照字典的升序进行排序先根据入度出度判断是否能形成欧拉路,否则就不能形成然后再进行DFs搜索需要注意一点的是,在判断欧拉路找起始点的时候,有可能会形成欧拉回路,因此找到此时的最小的一个节点即可View Code 1 #define N 1005 2 #include<algorithm> 3 #include<iostream> 4 using namespace std; 5 int n; 6 int degree_in[30],degree_out[30],edge_order[1000]; 7 struct Edge 8 {
阅读全文