1 条题解
-
0
自动搬运
来自洛谷,原作者为

MilkyCoffee
**搬运于
2025-08-24 21:37:43,当前版本为作者最后更新于2020-07-10 15:54:52,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
由于这道题有一名神仙选手
https://www.luogu.com.cn/user/10169424 篇题解,我来义无反顾的填补这个巨大的坑!这里很多题解都是几年前写的,思路不够完善、清晰,很多都是只放了一个代码就完事,我来注射一下新鲜血液。
首先我们输入 n 和 k 并且运用二分找到合适的尺寸,而l 必须要足够小,r 必须要足够的大。题中写道数组中的数最大不会超过 100000000 ,所以我们设 100000001 就可以了。
现在就走到了判断的环节,我们如何判断 mid 是太小还是太大呢?我们需要编写一个新函数 -- f。
在函数 f 中,我们依次要判断 a 中的每一个数并计算出能切出多少个 mid ,还要用一个变量 ans 储存他们,如果 ans 分的分数比 k 多或者正好等于,返回真。如果是小于 k ,返回假。
当 f 返回的是真的时候,我们就要试试还能不能把 mid 调大一点,就要
l = mid;如果返回的是假,我们就加的太大了,就要把 调小一点,就要
r = mid;一直到结束,输出 l 就可以了。
// #include <bits/stdc++.h> #include <queue> #include <stack> #include <cmath> #include <string> #include <cstdio> #include <iomanip> #include <cstring> #include <cstring> #include <iostream> #include <algorithm> using namespace std; long long n, k; long long a[1000005]; bool f(long long x) { long long ans = 0; for (int i = 1; i <= n; i++) { ans += a[i] / x; } return ans >= k; } int main() { cin >> n >> k; for (int i = 1; i <= n; i++) cin >> a[i]; long long l = 0, r = 100000001; long long mid; while (l + 1 < r) { mid = (l + r) / 2; if (f(mid)) l = mid; else r = mid; } cout << l << endl; return 0; }管理员求过,路过人求赞,希望能给你一点点小小的帮助呢~
- 1
信息
- ID
- 1446
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者