11915 玩猫猫 二分答案

解决思路

 
  • 二分查找:使用二分查找来确定每个成员分到的猫猫数量的最大值。
 
  • 检查函数:定义一个检查函数 check(mid),判断在每个成员最多分到 mid 只猫猫的情况下,是否可以将所有猫猫分完

 

  •  更新边界:根据检查函数的结果,更新二分查找的边界,直到找到最小的不满度。
 
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
ll n, m, a[N];

// 检查在每个成员最多分到 mid 只猫猫的情况下,是否可以将所有猫猫分完
bool check(ll mid) {
    ll sum = 0;
    for (int i = 1; i <= m; i++) {
        sum += (a[i] + mid - 1) / mid; // 计算每种花色需要的成员数
    }
    return sum <= n; // 判断是否可以在 n 个成员内分完
}

int main() {
    // 读取成员数和猫猫的花色种数
    cin >> n >> m;
    ll L = 1, R = 0;
    
    // 读取每种花色的猫猫数量,并找到最大值
    for (int i = 1; i <= m; i++) {
        cin >> a[i];
        R = max(R, a[i]);
    }
    
    ll ans = R;
    
    // 二分查找确定最小的不满度
    while (L <= R) {
        ll mid = (L + R) / 2;
        if (check(mid)) {
            ans = mid; // 更新答案
            R = mid - 1; // 尝试更小的最大值
        } else {
            L = mid + 1; // 尝试更大的最大值
        }
    }
    
    // 输出最小的不满度
    cout << ans;
    return 0;
}

 

posted @ 2024-09-30 17:16  CRt0729  阅读(16)  评论(0编辑  收藏  举报