uva1621 Jumping Around

中文题意刘汝佳紫书上有,这里从略

这种题属于构造题,所谓构造题,就是存在一种正解方法能对付所有情况,只需要找到这个正解方法便能AC。

对于这题,先想简单的情况,假设c=0,也就是你只能跳1格和跳2格,这种时候有什么办法能对于任何数据都能够完成任务呢。不难想到这样一种方法,假如a=1,b=x的时候,我可以一直向右跳2格,跳到尽头后根据x的奇偶性来决定向左还是向右跳1格,然后一直向左跳2格。对于a>1的情况可以先跳1格一直跳到只剩1个的时候在进行前面的方法。其实这种方法用到了一个性质,0,2,4...这些偶数在模2的情况下都是一个同余类,1,3,5...这些是另一个同余类,而每次跳2格只能在自己的同余类里跳来跳去,只有跳1格的时候才能改变成另外的同余类。

那么加入跳3格这种情况的时候,问题变的复杂了些。但是假如我们能找到这么一个方法,使得把3全部用完,而且在当前位置的左边的所有位置都走过,右边所有位置都没走过,那么就能转换成前面只有1格和2格的情况了。利用同余类的性质,我们可以这样思考:在模3的情况下一共有3种同余类,而只有1和2能改变当前同余类,假设现在c%3==0,那么我可以先向右走c/3个3格,然后右跳1格到另一个同余类,向左走c/3个3格,再右跳1格到最后一个同余类,向右走c/3格,这样我就能用掉所有的3格同时也把当前位置的左边全部走

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值