Test 2012-8-20 (Citric)
这次模拟赛是比较简单的一次,也是考得非常渣的一次,同样也是发现问题非常多的一次。XHR神犇真的是名不虚传,再次膜拜。
Lemon
的的确确是水题,但是小数的比较时999999999/1000000000与999999998/999999999在double范围内无法判断出来,所以需要到extended。更好的处理办法是把除法转化为乘法。
Tank
最长上升子序列的变形,题目中保证所有数都不相同的条件没有看到,导致弄巧成拙。不过也因此学到了点东西。可有相同元素的最长严格上升子序列,把相同x的先划为一组,每一个取最大值,然后再一起加入队列中。
Criminal
树形背包,需要用到两个dp数组。未调试完成,错误未知。
POJ2420
用登山算法解决。先随机一个坐标,并设定一个步幅,从坐标开始尝试往上下左右移动。移动成功则继续重复上面的过程,否则将步幅承上一个系数(0.7~0.75)再尝试移动,直到步幅到达某个精度。与退火方法的不同在于,退火还能解决存在局部最优解的情况,因为退火算法还会以一个小概率接受非最优解。
POJ1129
DFS解决,可以用四色问题进行剪枝。
POJ1320
pell方程。运用基本解及递推方程求前几组解。
1+2+...+(a-1)=(a+1)+...+b
a*(a-1)=(a+b+1)*(b-a)
2a^2=b^2+b
(2b+1)^2-8a^2=1
令x=2b+1 y=a
x^2-8y^2=1
基本解为x=3 y=1
递推方程为:
x[n]=x[1]*x[n-1]+d*y[1]*y[n-1]
y[n]=x[1]*y[n-1]+y[1]*x[n-1]
注意b=(x+1)/2
POJ1695
类似于跳舞家怀特的动态规划。首先至少用三维表示三辆车的位置,而由于先让一辆车去更远的地方等待与之后再去是一样的,所以不用再用一维表示完成范围。人为规定i,j,k非严格上升,f[i,j,k]表示三辆车在此位置时,1-k全部送达的最小花费。如果从之前的状态转移过来,之前的状态是否合法判断较麻烦,所以选择向后转移。分别枚举i、j、k走到k+1,更新之后的状态。由于我们的枚举一定包含了所有合法状态,所以不用最短路来预处理。
POJ2192
a、b、s三个字符串,问前两个能否不打乱顺序地组成第三个。
方法一:用work(i,j,k)表示三个串分别匹配到了i、j、k位置,进行DFS。不加末位字母的预先判断会超时。
方法二:f[i,j]表示a串前i个、b串前j个能否组成前i+j个,f[i,j]=f[i-1,j] or f[i,j-1]
POJ1135
最短路+枚举边。由于最后的一条多米诺骨牌不一定与时间最长的一个点相连,所以要枚举所有的边求一下最晚时间。
POJ1306
再次是求组合数的问题。一边乘一边约分可以避免高精除。而且题目中说不会超过int64,可以用一边乘一边约分,或者c(n,m)=c(n-1,m-1)+c(n-1,m)。
浙公网安备 33010602011771号