Codeforces Beta Round #2
最新推荐文章于 2019-05-31 21:20:00 发布
1000*1000的方阵,每个格子有一个非负整数,现在要从左上走到右下,每次只能向下或者向右走。目标是使得所有走的格子里的数的乘积里,末尾0的个数最少,要求输出最有解和走法。
不用怎么想也知道基本是个dp了,可以发现其实只有2和5的因子是有用的,但是如果状态同时记录2和5的因子个数的话,就不好表示了。其实方法很简单,对2个5分别做一次,第一次让2尽量少,第二次让5尽量少,两个里面取个最小的就是答案了,应该不难证明。dp过程就比较普通了,记录下路径,最后输出即可,不再赘述。
当然,本题是有一个比较大的trick的,就是如果其中有一个数字为0,那么最后的乘积可以为0,也就是答案至少可以是1。因此,只要先记录下方阵中有没有0,然后dp的时候强制不走0,最后输出走0和不走0的最优解即可。赛后我还测了一下,数据走没有一定要走0的数据,比较弱。
二维平面有3个圆,现在要求一个点,这个点看3个圆的视角一样大,其中点看圆的视角就是点和圆的两条切线之间的夹角。有多个点满足条件的话,输出使得视角较大的那个点。
首先考虑到两个圆的视角相同的点会满足什么性质。假设两个圆的半径分别是r1和r2,点到两个圆的距离分别是d1和d2,那么一定满足d1/r1 = d2/r2,即d1/d2 = r1/r2,到两定点距离比为定值的点的轨迹。通过google(-_-),我发现,当r1=r2时,轨迹是一条直线,否则轨迹是一个圆。于是剩下的问题就是苦力几何了,求出轨迹的圆和直线等,然后求出3个东西的公共交点即可
收益匪浅!对比较复杂的过程就是要熟!这样子才能有创新!!