usaco 2.3&2.4

2.3 longest prefix

 注意有多行的读入,所以用scanf("%s")比较合适,写后面的代码时,脑袋里总会冒出些新鲜的想法,结果越来越复杂,用dfs,开了个200*200000,超内存了,其实用最朴素的办法就可以解决。

 先初始化一个bool,bool[0]=1,每次匹配所有的元素,并把能完全匹配的元素,最后匹配到的位置标记为1,每次跳过为0的标记点,多次匹配后会发现中间空出来很多0,这都是所有元素都能匹配的,它们被跳过去了,这也正是效率所在(减少了判断量)。

 

2.3 cow pedigrees

 强烈的感觉是用dp,但半天找不出一个好描述的状态方程,来避免重复计算。

 可以用2个相邻的状态方程相减,去掉重复计算的部分。

定义f[i][j]为在前i个阶段添加j个节点的方案数,由于题目要求必须到达i层,所以,第i个阶段必须添加了节点,所以真正的答案是 f[i][j] - f[i-1][j];

递推方程:

f[i][j] = f[i-1][j-2] + f[i][j-2];

 

2.3 set zero

 用dfs,递归层数是固定的,方案也有限,可以轻松解决,需要注意些细节,个人感觉判断结果时从右往左判断比较方便,可以读到的字符转换成数字,空格号忽略,在读到运算符号时若‘+’就把前面转换的数加入add数组...最后统一计算.

 

2.3 money system

 与cow pedigree类似,用dp,刚开始写得时候只用1维数组来表示状态 f[i] = f[i - v[0]] +f[i-v[1]]+...

计算结果比样例多出很多,因为每种方案都是不考虑取币顺序的,而这种方程将顺序也算进取了。

 增加一个维度就可以描述

 f[i][j]为只考虑前i种货币,目标钱数为j,其中有限定,必须取第i种,于是

f[i][j] = f[1][j-v[i] + f[2][j-v[i]] +...(j>=v[i])

 

2.3 controlling companies

 虽然用并查集可以做,其实不需要用什么数据结构,只要搞清楚控制关系,安排好股份传递的函数就行。第一次写思路不清晰,越写越乱,看完官方标程,整理思路后顺利AC。

 

2.4 The tamworth two

 简单的图论题,为了方便判断,在图形周围多添加了一圈‘*',此外要注意的问题是判重。办法有很多种,建一个6维数组(勉强能开下),或当步数>160000时还未抓到就退出(没有尝试,可能会超时)。

2.4 overfancing

 第一次提交没有看清题意,以为是求2个出口间的最短路程,毅然选择了dfs,重读题后在原基础上修改了n遍,

各种wa和超时, 最后分析一下,dfs即使到最优,最后一个测试点在最坏的情况也要判断上十万次......果断超时了,其实这题从2个出口出发,用flood fill可以秒杀了。

 

2.4 cow tour

 用floyd算法可以很方便得求出每个牧场中各个牧区的最短距离,复杂度O(n^3)。求牧场的牧区集合(并查集),各个牧场直径,和各点最短距离,都有各自的算法,这题的关键就是设计好算法执行的顺序,分别执行,最后再枚举连通情况,这里要注意点,连通后的直径可能是牧区s1或s2原来得,也可能是新出现的。

 

2.4 comehome

 用bfs找到第一个有牛的牧场就行了并更新最小值,求距离时分步骤,在每个步骤都可以判断是否大于最小值,若是可以剪枝。

 

2.4 fraction to decimals

 其实这题应该每算一位就输出一位,因为小数位数是没有上限的,存入字符串再输出可能越界。可以先预处理算出循环种子seed(即产生循环的child),计算小数部分时遇到child=seed时就打印‘(’再次遇到是打印‘)’,退出。

 

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

转载于:https://www.cnblogs.com/eggeek/archive/2011/10/06/2281162.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值