CF Round#2

来源:互联网 发布:java 打印成记事本 编辑:程序博客网 时间:2024/05/18 02:44

A 水题

B 描述:给定一个元素非负的矩阵,求一条从左上到右下的路径。使得路径上所有数的乘积的后缀0的个数最少。

后缀0的个数即因式分解中10的个数,而10的个数是2的个数与5的个数间的最小值,则可以分别对2和5做DP,方程如下

F[i][j] = n[i][j] + max(F[i-1][j],F[i][j-1]);

Trick:数据中可能存在0,对于这种情况要特判,若能找到一条没有后缀0的路径,则可选取之。若不能则选路过0的路径。具体实现方法可将所有的0替换成10求解一次。

C 描述:求平面内一点P到三个给定圆R1,R2,R3的张角相等,若存在多个,求出张角最大的。

解法一

对于R1,R2,P对其二张角相等意味着r1/d(P,R1)= r2/d(P,R2)。则可对R1和R2以及R2和R3分别求出满足要求的点的集合,然后交起来再选一个张角大的即可。

当d(P,R1)=d(P,R2)时,集合是一条直线,其余情况下皆为一个圆,求交即为解二元二次方程组。

此方法编程复杂度较高

解法二

仍然依据上面推出的比例式,不过采用模拟退火的方法来做,估价函数选为三个比值的方差。另外考虑要让张角最大,因为距离越远张角越小。所以可以设置这样一个判断条件,取三个圆心的最小覆盖矩形作为可行域,解一定在该区域内。相应的,初始解可取三圆心中点,初始步长取初始解与三圆心间的最短距离。