解决思路
- 二分查找:使用二分查找来确定每个成员分到的猫猫数量的最大值。
- 检查函数:定义一个检查函数 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; }
标签:二分,猫猫,ll,mid,int,查找,11915 From: https://www.cnblogs.com/jyssh/p/18442196