上一页 1 ··· 49 50 51 52 53 54 55 56 57 ··· 85 下一页
  2011年12月22日
摘要: UVA_317 首先,先约定一下,我用a[i](0<=i<=2)降序存下了第一组数,用b[i](0<=i<=2)降序存下了第二组数,用c[i](0<=i<=2)降序存下了第三组数。 题目的大概意思是,根据给出的3组数,每组数里面挑出1个放到piece上的指定的方位上,要求piece不能旋转,这样会得到3*3*3=27个不同的pieces,挑出其中9个pieces拼成一个六边形,要求每个方位上的5列共计15列,每列上的数都是相同的,问最大的score是多少。 既然要求了每列都是同一个数,那么我们不妨想象成从每组数里面挑出一个数赋值给这个方位上的某一列,于是我们 阅读全文
posted @ 2011-12-22 19:02 Staginner 阅读(424) 评论(0) 推荐(0) 编辑
  2011年12月21日
摘要: UVA_185 第一部分就不详细说了,把字符串翻译成整数即可,关键在于第二部分,这个就像小的时候玩的填数字的数学题。 首先,我们不妨分析一下题目的特征,并试图找尽量多的回溯的条件。 显然我们应该从个位加和算起,这样既符合我们的运算习惯,也方便我们对表达式求值。我们不妨设对竖式的每一列的分析都是x+y+s=z的形式,其中s为前一位进上来的余数,那么我们当然选择去枚举x和y的值,这样z就自然确定了,如果枚举z的值话就显得麻烦多了。 在枚举x和y的时候都会遇到三种情况,第一种情况是这个字符在前面的运算中已被赋了一个值了,第二种情况是这个字符还没有被赋过值,第三种情况就是不存在这一位(说道这里... 阅读全文
posted @ 2011-12-21 19:35 Staginner 阅读(614) 评论(0) 推荐(0) 编辑
摘要: UVA_10160 这个题目我改下一下Dancing Links的算法,没想到搜过去了,只不过时间花的比较多。 由于原本Dancing Links是解决精确覆盖问题的,而这个问题是可以重复覆盖的,所以要把Dancing Links的删除和恢复的操作改变一下。 当然,还有更高效的搜索方式,可以google一下。#include<stdio.h>#include<string.h>#define INF 0x3f3f3f3fconst int MAXN = 40;const int MAXD = MAXN * MAXN + MAXN;int U[MAXD], D[MAXD] 阅读全文
posted @ 2011-12-21 14:46 Staginner 阅读(574) 评论(0) 推荐(0) 编辑
摘要: UVA_10123 以下斜体部分是我第一次写的解题报告,但后来越来越觉得我实现的程序和我的想法并不怎么挂钩,于是就越发怀疑程序里那个剪枝的正确性了。 再后来看了UVA的论坛之后,发现上面有人提到用记忆化搜索去解,我这时再一看N只有20,完全可以用状态压缩+记忆化搜索来做,只是当时没有想到,其中一部分原因也是觉得LRJ放在了回溯这章里面,就压根没向着dp的方向去考虑,一直在想怎么剪枝去了,便也凑巧,居然诞生了下面的我现在也不知道正确与否的回溯做法。以后千万不要局限于已知的这题的归类,换个思路也许就能海阔天空了。 如果各位兄台谁有兴趣证明出了或者推翻了下面这个回溯的程序,还望能和小弟分享一下... 阅读全文
posted @ 2011-12-21 01:11 Staginner 阅读(845) 评论(1) 推荐(0) 编辑
  2011年12月20日
摘要: UVA_696 一开始没什么思路,看了别人的解题报告之后发现可以总结出规律的。 为了讨论方便,不妨设边长小的为M,大的为N。 对于马来讲,它不会攻击与它同行、同列及同斜线的马,这样其实我们也可以YY一下的,分别放一行、一列、一斜列,最后发现对于一些M、N稍大的情况,最优解就是交错一斜列、一斜列地放出来,这样的解比较容易总结出是(M*N + 1)/2。 但也有特殊情况,比如M=1时,这样可以放满这一行,结果就是N。 比较难想到的应该就M=2的这种特殊情况了,最优解需要从左向右,间隔在田字格内放4个马。 具体直观的图可以看一下Knowledgetime的百度空间。 http://kong... 阅读全文
posted @ 2011-12-20 20:50 Staginner 阅读(402) 评论(0) 推荐(0) 编辑
摘要: UVA_10570 一开始没有理解题目中所说的exchange positions,还以为只有相邻的才能换,后来发现不相邻的也可以换。 第一次AC的时候有点YY的味道,但后来想了一下,确实这么做是可以的。 首先破环为链,那么最后的序列不论是正着还是反着,都会以其中某一个点为起点,于是我们枚举起点和序列的正反,求出最小的exchange即可。在求的时候用贪心的思想,首先把1换到位置1,再把2换到位置2,如此反复下去。 对于贪心思想的证明,后来想了一个粗糙的证明,不知道这么证是否有说服力。 比如我们在安排1的时候,如果不直接把1换到位置1,那么必然应该是先让1和x换一下(或者中间换很多次... 阅读全文
posted @ 2011-12-20 19:22 Staginner 阅读(763) 评论(1) 推荐(1) 编辑
摘要: UVA_306 一开始倒是想到了这种移位加密是有周期的,但最后却是用的它们的最小公周期去算的。 后来发现比别人的程序要慢很多,仔细看后才发现实际可以对每个字符的位置都用它自己的周期算一下,得到的位置也就是该字符最终的位置,这样相比用最小公周期去算要节省很多时间。#include<stdio.h>#include<string.h>#define MAXD 210char b[310], txt[MAXD], code[MAXD];int g[MAXD], N, p[MAXD], t[MAXD], K;void init(){ int i, j, k, n; for(i 阅读全文
posted @ 2011-12-20 17:14 Staginner 阅读(403) 评论(0) 推荐(0) 编辑
  2011年12月19日
摘要: UVA_10994 这个题目一开始WA了几次,抱着侥幸的心理把几个感觉可以是int的也改成了long long int了,没想到AC了,后来发现可能是一个乘法的细节溢出了,以后一定得多注意这类的问题,避免中间结果溢出。 下面说这个题目的思路吧,其实对于个位1-9都是一样的,只不过10的倍数变化比较大,于是我们不妨先算完个位不为0的,然后把区间除以10,这样新区间里面剩下的就都是10的倍数了,然后再不断重复前面的操作就可得到最后的结果,注意最后区间长度小于10的时候就直接把他们的和算出来就可以了。#include<stdio.h>#include<string.h>lon 阅读全文
posted @ 2011-12-19 23:19 Staginner 阅读(391) 评论(0) 推荐(0) 编辑
摘要: UVA_254 一开始看错题目了,没有按照题目的要求去做,按题目中描述的算法去做的话,在n为偶数时和我们平常移动的结果是一样的,而当n为奇数的时候,最后会把所有的盘子移到中间的柱子上,实际上就是相当于调换的中间和最后柱子而已。 在找状态的时候可以用递归来处理,我们首先指定盘子堆的初始柱子s,和该堆最下面盘子所期望移动到的柱子t,从最大的盘子找起,分情况讨论最大的盘子能否移动,然后改变相应的状态继续递归即可。import java.math.BigInteger;import java.util.Scanner;public class Main { public static int... 阅读全文
posted @ 2011-12-19 21:56 Staginner 阅读(489) 评论(0) 推荐(0) 编辑
摘要: UVA_701 看了别人的解题报告之后,发现可以枚举剩余数字的位数,我们不妨设其为k,那么我们会得到不等式,N*10^k<=2^E<N*10^k,化简之后就可以得到log2(N)+k*log2(10)<=E<log2(N+1)+k*log2(10),我们设左右边界为a、b的话,问题就等价于如果在枚举k的过程中出现了[a,b)内有一个整数点的话,那个值就是E。 首先来讲,由于b-a=log2((N+1)/N)<log2(2)=1,所以区间内如果出现整数点的话最多只有一个。接着,我们要解决的问题就是,随着我们不断地枚举k,是否一定在某一刻内出现[a,b)内有一个整数点 阅读全文
posted @ 2011-12-19 18:21 Staginner 阅读(536) 评论(0) 推荐(0) 编辑
上一页 1 ··· 49 50 51 52 53 54 55 56 57 ··· 85 下一页