10 2012 档案
摘要:在CF上做了两场比赛,又在ural上尝试做了几道题,最后还是决定以后的训练还是主要集中在CF上吧,是时候把学的知识融合一下了,而且在POJ上总是会习惯的去看discuss里的讨论,不会自己认真去想,应该换个地方练练了。不过貌似有点“出师不利”啊,昨天做了一道题,WA了整整一版也没过,最后终于想不出是哪里错了,参考了一下别人的代码,结果他们都是用STL做的,思路都一样,SPFA求最短路。于是改用STL做了一下,开始初始化小了,WA了一次就过了,然后改用二维数组又写了一遍,还是过不了第66个样例,不知道怎么办了,应该是第66的样例中有时间延迟数据很多的,我开的数组不要够大,但是二维数组不能再开大,
阅读全文
摘要:最近做了两场CF比赛,战况惨烈,Rating已经跌到底了,但是仍觉得收获颇丰。第一场比赛没什么经验,就按平时的练习来做的,500的题1A后,信心倍增的去做1000的题,结果就卡死在这道题上了,一道数论题,所用的知识点也不难,但是当时就是没想到,不能说没想到吧,其实我是有想到要有这个知识点做的,但是没有具体思路,或者说没有证明出来,没有信心保证对,所以就没尝试着写,就这样两个小时很快就过去了,第一次觉得时间过得这么快。赛后问了一下队友,确定是用这个知识点,然后自己写了代码,也没感觉有什么难的,就是第一次枚举的素数过少了,WA了一次。B、Easy Number Challenged[n]表示n的所
阅读全文
摘要:题意:windy要组建一支军队,召集了N个女孩和M个男孩,每个人要付10000RMB,但是如果一个女孩和一个男孩有关系d的,且已经付给了其中一个人的钱,那么就可以付给另一个人10000-d元,求windy最少要付多少钱。解题过程:写了一个prim的最小生成树才发现原来整个图不是连通的,所以想到用Kruskal,刚开始的时候val中存的是10000-d,然后求最小生成树,但是最后求有几棵树的时候不是很好计算,改了一下f[x]、f[y]的赋值规则还是不行,然后看到有人说求最大生成树,然后就改了一下条件就AC了。代码:View Code #include <stdio.h>#includ
阅读全文
摘要:题意:给出N个正常的机器人,还有一个感染病毒的机器人,从这台机器人开始传播病毒,当传染到一个机器人,这个机器人也开始加入传播的行列,向其他正常的机器人传播,问最少的时间。解题过程:这题说难其实不难,也很容易就能想到用最小生成树,就是对BFS搜索算法的不熟,导致在建立连接的时候有些麻烦。这题先用BFS计算出任意两点之间的距离,然后用prim算最小生成树就行了。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include
阅读全文
摘要:困啊!!不知道学校怎么想的,一声令下就要每天开始晨练,由于消息来得过于突然,导致的后果就是,食堂吃饭的人剧增,去的晚了点差点没吃上饭;起得太早没睡好,上课浑浑噩噩的,唉,今天还是早点睡吧。。。。。本来打算昨天做完这题就开始下一个知识点的,但是前两天做一场CF,里面有两道数论题,当时没做出来,昨天就做了做,所以推到了今天。题意:给出一个R*C的矩阵,每个矩阵的点都有一个海拔高,开始有一个初始速度V,然后每个点的速度是V*2^(h[1] - h[i] ),所花费的时间是速度的倒数,求从左上角的点到右下角的点的最少时间。思路:从公式可以得出,要从a->b->c,则c出发的速度就是V*2^
阅读全文
摘要:又是一道改变松弛条件的题目,因为查询不是一组,所以用floyd比较快。解题过程:题目很容易理解,就是从一个点A到另一个点B的所有路中最大高度中的最小值。因为有多组查询,用floyd求任意两点间的最小值,改变一下map[i][j]里的存储,存储点i到点j的所有路中的最大高度的最小值就行了。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <math.
阅读全文
摘要:最近几天一直在做搜到的一些中级最短路题目,做得多了也有了一点感觉,觉得中等最短路一般不是建图麻烦些,就是松弛的条件要改变一下得到所求。其实了解透了几种最短路求解方法就很简单了。解题过程:一颗有N个节点的树,点1是根节点,每个节点都有一个权值,每两个节点的边都有一个代价,定义一棵树的花费为每条边的代价为该边所有子孙节点权值之和乘以该边的权值。例如点1到点2的边的代价为w1,点2到点3的边的代价为w2,得出下面等式:(d1+d2+d3)*w1 = d1*w1 + d2*w1 + d3*w1 (d1+d2+d3+d4)*w2 = d1*w2 + d2*w2 + d3*w2 + d4*w2加起来的:s
阅读全文
摘要:和2253题类似,但所求正好相反。题意:有M条路连接N座城市,每条路都有最大载重量,要从城市1到到城市n求最大的载重量。思路:就是要求所有路中的最小值中的最大值,呃,将2253题的松弛条件改一下就行了。不多说了。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <math.h>#include <queue>#define N 1
阅读全文
摘要:题意:有个N个点的有向图,求从点1到其他各点,然后从其他各点回到点1的最小距离。思路:题意很容易理解,但是这题给的时间有点紧,不能用Dijksra 和Bellman_ford来做,只能有Spfa,先求出点1到到其他各点的最短距离,然后将边逆转,再求一下点1到各点的距离,求和就行了。明明思路是对的,但是愣是WA了一上午,不知道哪里错的,将discuss里提到的各种注意都改了,还是不对,差点疯了,结果不知道改了点什么就AC了,郁闷啊!!!代码:View Code #include <stdio.h>#include <stdlib.h>#include <string
阅读全文
摘要:其实这题是昨天做的,不过没来的及写Blog,还有通过这题想通了一些问题,所以想专门的抽个时间好好写写,嗯,今后要好好写Blog,利用这段时间好好整理一下自己的思路,这样也好。这题的题意就不说了,汉语,没有什么理解上的问题,这题最大的障碍就是在怎样处理等级问题上。开始的时候,我尝试着用Bellman_ford,在松弛的时候加上等级的处理,但是我理解错了一句话,“地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。“这句话是说从源点开始扩展的所有点都必须在源点的等级限制范围内。而Bellman_ford的松弛处理则并不能保证这一点。所以很不幸的WA了,然后看discuss里的人用
阅读全文
摘要:题意:给出一个有N个点的图,求每一个点到其他各点最长距离中的最小值。思路:读懂了题意,这题就是一个水到不能再水的题。就是一个flody,然后求出任意两点的最小距离。然后一个二重循环就行了。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue>#include <math.h>#define N 105#define IN
阅读全文
摘要:我发现,做题最痛苦的就是读不懂题,比这更痛苦的是,上网搜题意竟然还是错的,纠结啊。。。。。。唉,看了N个解题报告,终于明白了题目的意思,就是有一只青蛙在1号石头上,他要跳到2号石头上,中间可以借助其他石头,一条线路中最长的那段距离作为这条路的代价,求所有路中代价最小的那个。如果读懂了题这题就很容易做了,刚开始的时候,看了discuss里的一个公式,map[i][j] = min(map[i][j] , max(map[i][k] , map[k][j] ));三重循环直接求出来了。代码:View Code #include <stdio.h>#include <stdlib.
阅读全文
摘要:题意:农民john有N快田,M条路,w个虫洞,虫洞的功能回到多少分钟之前。思路:想法很简单,将w个虫洞的值存为负值,然后求图中是否有负环路,如果有就输出“YES”,否则输出“NO”。但是题目中有重复的路要滤除,还有这题有连接表存储比用邻接矩阵存储有简单。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue>#include <
阅读全文
摘要:最短路问题,但是刚开始的时候没什么想法,因为看到题目中要求回到源点,但是最短路都是求一个点到另一个点的最短路,想到要处理环,就有点头疼,因为对最短路理解的不透彻,又上网认真的学了学求最短路的各种方法。Dijkskra:贪心的思想,从源点开始,先查看所有与源点相连的点,找出一条最短的路,然后从这个点重复上一个过程,直到找到目标点。要求图上的权值为非负数,时间复杂度为O(n2)。Floyd:这是我认为写法最简单,也是最容易理解的一种算法,可以想成一个图中只有三个点,判断一下,是源点直接到终点近,还是通过中间那个点间接的到终点近,如果通过间接的点近,就更新,由此推到有n个点的图中,所以三重循环即可。
阅读全文
摘要:重新开始做搜索题,发现理论和应用还是有很大的差别的。。。。题意:给出一个有1*1的小矩形组成的大矩形,矩形的边可能是墙,也可能是门,要出(0,0)点到达给定的一个点,问最少要过几个门。解题过程:首先,discuss里面说,给出的点不一定在给出的矩形里,如果不在直接输出0。然后就是建图了,其实这题思路很简单,但是建图麻烦,刚开始的时候,按题目中给出的方法建图,用一条线段的左下点记录,但是这样只是记录了线段的状态,并没有建图,然后参考了下面的Blog建图才AC的,但是还是ML了几次,我发现在题目中随机定义变量会很浪费内存,所以最好提前定义好所有变量,也可以重复利用变量。http://www.cnb
阅读全文
摘要:题意:一个人站在N点,一头牛站在K点,这个人要到达牛的位置,他每分钟只能到达N+1,N-1,和2*N的位置,求最少要多少分钟。思路:好久不做搜索题竟然将它忘的干干净净了,唉。这题让求最少时间,当然用BFS,开始做的时候竟然没想起来,然后做的时候,竟然将队列写成了栈,浪费了好长时间,看来还要坚强训练啊。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include &l
阅读全文
摘要:题意:一个二叉树,根节点为(1,1),左孩子为(a+b,b),右孩子为(a , a+b),给出一个区间(i,j),让你求一条最短的路中经过几个左孩子,几个右孩子。解题过程:刚开始的时候,画出树来开出有规律,但是没想出来要逆序推,一直从上到下找规律,结果怎么也找不到,后来参考了别人的思路,才知道要从下往上推。题目中已经给出规律了,任意一个左孩子区间,左边数总小于右边数,任意右孩子,左边数总大于右边数。即如果i<j,则该节点属于左孩子,i>j,则该节点属于右孩子,然后从(i,j)推到(1,1),记录左右节点数。由于数据很大,要用除法计算,还要注意一点是:如果i%j==0,那么i=1.代
阅读全文

浙公网安备 33010602011771号