Intel Code Challenge Final Round C.Ray Tracing

C.Ray Tracing


题意:在n*m的空间内,一个小球从(0,0)以固定的速度 2 ,并且以斜45°的角度出发.若碰到空间边界则反弹.若碰到空间四个角落的点则停止.给你k个点,问到达该点所需时间,若到达不了,则输出-1.


思路:
1. 按照给出的样例模拟走几遍,可以发现结束的时间为 lcm(n,m) .
2. 希望将这些折线放在 y=x 这条直线上,就可以方便计算某点时间.那么就可以考虑怎么样找出该点在 y=x 上的点.

  • 任意点 (x,y) ,设在直线 y=x 上的点为 (x,y) .
  • xxmod(2n) , yymod(2m)
  • 即转化成线性方程组 2nX+2mY=yx
  • 用扩展gcd求解
  • 假设点 (x,y) 是第一次反弹后那条折线上的点,那么它在 y=x 上的点为 (2nx,y) (x,2my) .
  • 若是两次反弹后那条折线上的点,那么它在 y=x 上的点为 (2nx,2my) .
  • 若点 (x,y) 中x=y,那么它就在直线 y=x 上.
  • 不确定该点是几次弹射后,就对这四个点都进行一次方程求解,取最小值.

This Code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值