这个问题的目标是“最大化”小明(编号为 k)的苹果数。这类“求最大值的最小值”或“求最大值”的问题,如果答案具有单调性,通常可以考虑使用二分查找(二分答案)来解决。
单调性分析: 假设小明最多可以分到 x 个苹果。那么,他一定也可以分到 x−1 个苹果(例如,在 x 的最优方案里,从他的苹果里拿走一个,所有条件仍然满足,只是总苹果数变少了)。反之,如果我们验证出小明无法分到 x 个苹果(即无论怎么分配,总苹果数都会超过 m),那么他也一定无法分到 x+1 个苹果。 因此,小明能分到的苹果数 x 具有单调性,我们可以二分查找这个 x 的最大可能值。
构建 check
函数:
二分查找的关键是 check(x)
函数,即验证“小明获得 x 个苹果”这个方案是否可行。为了让小明获得 x 个苹果的同时,使用的总苹果数最少,其他小孩的苹果数应该尽可能少。
有 m 个苹果,n 个小孩。每个小孩都有一个编号 1−n ,小红的编号是 k 。要尽量公平的分苹果,相邻编号的小孩分到的苹果数目差距不能大于 1 。请问如何在满足相邻编号的小孩分到的苹果数目差距不能大于 1 的情况下,小红分配到的苹果数目最多,并且输出这个最大值,每个小朋友至少需分配到一个苹果。
第一行三个整数 n,m,k(1≤n≤m≤109,1≤k≤n) 。
输出一行,表示小红分配到苹果个数的最大值。
输入
4 6 2
输出
2
说明
可以这样分配 1 2 2 1 。
可以小红分配到了 2 个苹果。