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) 编辑
摘要: UVA_10205 这个题目感觉就像是个模拟题,只不过读数据的时候比较蛋疼。 我们可以始终记录每个位置上是那张牌,但这样的话每次移动的时候就必须借助一个临时数组,因为在移动的过程中我们要知道上一次各个位置的牌的情况。 于是我们不如换个思路记录每张牌在哪个位置,这样我们每次移动的时候只需要知道每个牌所在位置变换到了哪个地方。 最后再把每个牌所在的位置还原成每个位置有哪张牌即可。#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXN 110char b[500];int g[MAXN][6 阅读全文
posted @ 2011-12-19 13:47 Staginner 阅读(465) 评论(0) 推荐(0) 编辑