題解/算法 {6168. 恰好移动 k 步到达某一位置的方法数目}

题目链接


题解

题目很简单, 乍一看也很有思路, 可很容易掉进去…


令D为abs( E - S), 表示, 两点的距离

假设S < E (不影响答案)
对于任意一个方案, 一定是( D个1 径直的往右走, 剩下的(K-D)是一半是1, 一半是-1 无效的)

注意特判, K < D无解; K-D是奇数 无解;


错误思路
一共走K步, 其中有(D)步 是有效的, 剩下的(K - D)的无效的
C(K, D) * F F表示(在K-D个位置中, 有一半1 和一半的-1, 的不同排列个数; 这是可以求的)

其实这是错的…

K=3, D=1; C(K, D) = 3, 即[1] ? ? ? [1] ? ? ? [1]
那么, 每一个? ?, 都有2种选择: 比如 [1] 1 -11 [1] -1, 他们就重复了!!!


还有诸多错误的做法…

其实应该从(排列)的角度去思考, 因为, 不同的方案 就是 不同的排列;
这个排列 长度为K, 且有(D个1, 和 (K-D) / 2个1 和 (K-D) / 2个-1), 记作: a = D + (K-D)/2, b = (K-D)/2
即, a个1, b个-1, a + b = K

这不就简单多了…

N个不同元素的全排列个数是: N!
N个(含有相同元素)的全排列是: N! / A! / B! / C! / ... (A, B, C .. 为每一类相同元素的个数)

K! / a! / b!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值