技术编程题求解:Hide and Seek(猫鼠躲猫猫问题)
解题思路:Hide and Seek 编程题
问题分析
核心矛盾在于:老鼠需要在汤姆到达其初始位置前,完成足够步数逃到鼠洞;汤姆会直接向鼠洞移动,途中抓捕所有未及时逃离的老鼠。双方均采取最优策略:老鼠优先让最容易逃脱的个体行动,汤姆则以最快速度向鼠洞移动以最大化抓捕数量。
关键观察
- 每只老鼠逃到鼠洞需要的步数为
s_i = N - x_i(x_i是老鼠与汤姆的初始距离,N是汤姆到鼠洞的距离)。 - 汤姆到达老鼠
i的初始位置需要x_i步,在此之前,老鼠共有x_i次行动机会(每次汤姆行动前,有一次老鼠行动的机会)。 - 要让老鼠
i获救,需保证前面所有获救老鼠的总行动步数之和不超过x_i(否则汤姆到达该位置时,老鼠还未完成逃离)。
最优策略(贪心算法)
- 排序:将老鼠按与汤姆的距离
x_i从大到小排序(离鼠洞越近的老鼠,x_i越大,需要的逃离步数s_i越少,且汤姆到达其位置的时间越晚,可用行动机会越多)。 - 累加验证:依次累加每只老鼠的逃离步数,若累加和超过当前老鼠的
x_i,则后续老鼠均无法获救,停止计算;否则计数加一。
代码实现
n, k = map(int, input().split()) x = list(map(int, input().split())) x.sort(reverse=True) sum_s = 0 count = 0 for num in x: s = n - num sum_s += s if sum_s > num: break count += 1 print(count)
样例验证
样例输入1:
2 4 1 1 1 1
- 排序后
x仍为[1,1,1,1],每只老鼠的逃离步数s_i=1。 - 累加第一个
s_i=1,1<=1,计数为1。 - 累加第二个
s_i=2,2>1,停止计算。最终输出1,符合样例结果。
内容的提问来源于stack exchange,提问作者rishav krishna
相关产品推荐
相关产品推荐

