2011年9月8日
摘要: UVA_784 这个题目是个相对容易的搜索题目,同时在搜索的过程中也无需再用vis数组标记是否访问过了,因为染过色就相当于访问过了。#include<stdio.h>#include<string.h>int a[50][100],n;char b[100];int dx[]={-1,1,0,0},dy[]={0,0,-1,1};void dfs(x,y){ int i,newx,newy; for(i=0;i<4;i++) { newx=x+dx[i]; newy=y+dy[i]; if(a[newx][newy]==1) ... 阅读全文
posted @ 2011-09-08 18:11 Staginner 阅读(295) 评论(0) 推荐(0) 编辑
摘要: UVA_657首先可以用一个数组a[][]来存储图,其中“.”为-1,“*”为0,“X”为1。为了确保能把每个骰子都遍历完,我们可以使用两个判断是否访问的数组vis0[][]和vis1[][],其中vis0为是否遍历过骰子上的点(包括X和*),由深搜函数dfs0使用,vis1表示是否在搜索X时搜过当前的X。当我们遍历时候,如果遇到*或者X就进入dfs0,如果当前点为X时再跳入dfs1,每当在dfs0中跳入dfs1并跳出时,骰子的点数加1,当所有dfs0结束的时候,骰子数加1。#include<stdio.h>#include<string.h>#include<s 阅读全文
posted @ 2011-09-08 17:50 Staginner 阅读(417) 评论(0) 推荐(1) 编辑
摘要: UVA_572这是个相对容易的搜索题目,只要依次遍历图,遇到没有访问过的“@”就开始广搜或者深搜,直到把8个方位相邻的“@”都搜完位置。每进入一次搜索,总数就加1。#include<stdio.h>#include<string.h>int a[110][110],vis[110][110],num;char b[110];int dx[]={-1,1,0,0,-1,-1,1,1};int dy[]={0,0,-1,1,-1,1,-1,1};void dfs(int x,int y){ int i,newx,newy; for(i=0;i<8;i++) { ne. 阅读全文
posted @ 2011-09-08 17:05 Staginner 阅读(391) 评论(0) 推荐(0) 编辑
摘要: UVA_307相当于重温了一下POJ 1011这个题目,剪枝在这个题目中显得尤为重要。对于这道题而言,剪枝的策略一般有下面6个:①先将木棒长度从大到小进行排序,这样便于后面的选择和操作,是后面一些剪枝算法的前提。②在枚举原木棒长度时,枚举的范围为max与sum/2之间,如果这个区间内没有找到合适的长度,那么最后原木棒的长度只能是sum。③枚举的原木棒的长度只能是sum的约数。④在深搜过程中,如果当前木棒和前一个木棒的长度是一样的,但是前一个木棒没有被选上,那么这个木棒也一定不会被选上。⑤在深搜过程中,如果当前是在拼一根新木棒的第一截,但如果把可用的最长的一根木棒用上后不能拼成功的话,那么就不用 阅读全文
posted @ 2011-09-08 14:30 Staginner 阅读(864) 评论(0) 推荐(0) 编辑
  2011年9月7日
摘要: HDU_4020思路还是比较好想的,进行排序再统计即可,但是不同的处理方式之间存在着时间的差距。我后来选择的方式是,先将所有数据的标号r[i]依点击次数进行排序,然后初始化一个数组hash[]=0,hash[i]表示依次遍历时customeri出现的次数,用一个数组ans[i]来记录每个customer点击率排行第i的广告的总的长度,即在遍历的时候令ans[++hash[r[i]]]+=click[r[i]]即可。最后再用一个数组res[i]来表示每个customer点击率在第i位及之前的所有广告的总长度。#include<stdio.h>#include<string.h& 阅读全文
posted @ 2011-09-07 23:20 Staginner 阅读(316) 评论(2) 推荐(1) 编辑
摘要: HDU_4001 这个是一个相对容易的动态规划题,由于每次activity的时候M一定是在上海的,因而要达到这个状态,要么从前一次activity结束一直到现在M一直在上海,要么在上一次activity结束之后M飞回了北京,并在这次activity开始前一天飞到了上海(这种情况的前提是两次activity之间的间隔时间大于或等于2天),在两种情况中取一个花费最小的情况即可。#include<stdio.h>#include<string.h>int n,a,b,d[100010];double cost[1000010];int main(){ int i,j,k,t; 阅读全文
posted @ 2011-09-07 22:43 Staginner 阅读(261) 评论(0) 推荐(0) 编辑
摘要: UVA_208这个题目思路很简单,但关键在于对深搜的优化(也即剪枝)。同时,这个题目好像没说最后要按字典序输出方案,但确实只有按字典序输出方案才能AC。(如果你看到了题目中有这点要求,千万别用鸡蛋砸我,我英文不好……)一开始我用邻接矩阵写,超时了,后来改成了邻接表还是超时。看了别人的报告后,说是一开始先把到达起火点的所有点找出来,然后再从这些点中挑DFS时用到的点。这样写完之后果然AC了,而且时间还很快,反思了一下,可能是测试数据中存在起点与终点不连通的数据,而与起点相连的又恰好是一个稠密图,反向搜索可达点、正项搜索路径恰好解决了这个问题。其实在找能到达起火点的点时,也可以用并查集,个人感觉并 阅读全文
posted @ 2011-09-07 22:34 Staginner 阅读(1039) 评论(0) 推荐(1) 编辑
摘要: UVA_193这个题目的题意并不难理解,但由于这个题目节点数最多可到100个,如果是直接依次枚举每个点并判断这个点时候可以涂成黑色的话是会超时的。仔细想了一下,实际上如果一个点涂成黑色的话,那么和它相邻的所有点都必须涂成白色,这样如果我们每涂一个黑色的点,实际上剩下的可以涂成黑色的点就很明显了,只要是没有涂过色的都可以。只要按这样的规则不停地枚举可以涂成黑色的点并将其涂成黑色就可以了,当被涂色的点的数量达到n时,就可以数涂成黑色的点的数量了,或者可以直接把黑色的点的数量当做深搜函数的一个参数,这样最后就不用再数一遍了。想到上面的思路后,深搜的函数就比较好写了。#include<stdio 阅读全文
posted @ 2011-09-07 12:16 Staginner 阅读(728) 评论(2) 推荐(0) 编辑
摘要: UVA_10001由于这个题目主要是理解题意的问题,所以就多用些文字放在解释题意上面吧。这个题目大致的意思是这样的,一共有这样256个自动机,它们可以依据一个字符串当前的状态,并将其按某种法则转化成一个新的字符串,题目的要求是对于给出的指定型号的自动机以及一个字符串,然后去判断是否存在一个这样的字符串,经过Input中的自动机的转化能够变成Input中的字符串。那么自动机的型号是怎么确定的呢?对于一台给定的自动机,它的转化字符串的法则又是怎样的呢?我们把题目中的图解释清楚,这两个问题自然就迎刃而解了。题目中的图是这个样子的:其中左边3列描述的是原字符串当前格子(Cell)以及左右两边的格子的状 阅读全文
posted @ 2011-09-07 00:53 Staginner 阅读(1347) 评论(5) 推荐(1) 编辑
  2011年9月6日
摘要: UVA_140这个题目首先在读取数据的时候要把所有顶点存放在一个数组里,同时用邻接矩阵把顶点间的关系存储下来。之后对顶点进行升序排序,之所以排序主要是因为题目中要求结果相同时输出字典序最小的方案,而排序之后顺序深搜到的第一个符合要求的解,一定是字典序最小的解。然后只需要枚举所有排列并进行计算即可。#include<stdio.h>#include<string.h>#include<ctype.h>#include<stdlib.h>int n,a[10],A[10],G[30][30],vis[10],ans[10],res;char b[10 阅读全文
posted @ 2011-09-06 21:06 Staginner 阅读(509) 评论(0) 推荐(0) 编辑