2021年度训练联盟热身训练赛第五场 I.Jam-packed

题目链接:Jam-packed

  • 题意:给出n瓶果酱,每一个箱子最多可装m瓶,问装完所有的果酱后,最少果酱的箱子中最多可以有几瓶。
  • 题目来源:这题在比赛的时候队友是根据数学来推出一个函数,然后通过函数性质求出最值的,然后比较难想到,我就看了一下其他大佬解法,发现可以用二分解,所以就记录一下。
  • 解析:利用二分的思想,假设每箱都装mid瓶(题目没有规定箱子数量)一共装了y = n / mid箱,若剩下的果酱 = (n % mid)(最后一箱可能正好mid瓶,可能小于mid瓶)能装入这y箱所剩余的位置((m - mid) * y),那么说明符合要求,先记录下mid值,若不能装下,说明每箱的最小值取大了,这时右区间必须缩小。
  • 代码:
#include<iostream>
using namespace std;
typedef long long ll;

int main()
{
    ll n, m;
    cin >> n >> m;
    ll l = 1, r = m;
    while(l < r)
    {
        ll mid = (l + r + 1) / 2;
        if(n % mid <= (n / mid) * (m - mid)) l = mid;
        else r = mid - 1;
    }
    cout << r << endl;
    return 0;
}

posted @ 2021-04-13 19:42  ~K2MnO4  阅读(146)  评论(0)    收藏  举报