kk 有 n 种不同颜色的积木,每种颜色的积木数量为 a[i] ,现在kk 正在玩一个获取金币的小游戏,每当他用 k 个颜色互不相同的积木堆叠在一起时,kk 可以获得一个金币。为了攒足够的金币换取可爱的玩偶,kk 需要你帮他计算一下他最多可以获得多少金币。用c++解决这个问题,要用二分的方法
时间: 2024-02-18 14:00:53 浏览: 21
以下是使用二分法解决此问题的示例代码:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1e5 + 5;
int n, k;
int a[MAXN];
bool check(int x) {
int cnt = 0;
for(int i = 0; i < n; i++) {
cnt += a[i] / x;
if(cnt >= k) return true;
}
return cnt >= k;
}
int main() {
cin >> n >> k;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
int l = 1, r = *max_element(a, a + n);
while(l < r) {
int mid = (l + r + 1) / 2;
if(check(mid)) {
l = mid;
} else {
r = mid - 1;
}
}
cout << l * k << endl;
return 0;
}
```
在这个代码中,我们先使用 `max_element()` 函数求出积木中的最大值作为二分的右端点,然后在 `check()` 函数中模拟将积木堆叠起来的过程,判断是否可以堆叠出 k 个堆叠物。接着,我们使用二分法求出最大的堆叠高度,最终输出获得的最大金币数量。
值得注意的是,我们在二分法中使用了 `(l + r + 1) / 2` 而不是 `(l + r) / 2`,这是为了防止在 `l == r - 1` 的情况下陷入死循环。