C++给一个序列 a1,a2,…,an。 你可以对这个序列进行操作,每次操作可以选择一个元素,把它加 1,经过不超过 k 次操作之后,希望序列里面的最小值最大。问这个值是多少。
时间: 2024-02-17 10:01:07 浏览: 104
C++求最大最小值的问题
4星 · 用户满意度95%
这是一道二分答案的题目。
我们二分答案 $x$,然后判断能否对原序列进行不超过 $k$ 次操作,使得序列中的最小值不小于 $x$。
具体地,我们可以用一个变量 $cnt$ 记录当前已经使用的操作次数,从左到右遍历原序列,如果当前元素小于 $x$,那么我们就对该元素进行加 1 操作,并且将 $cnt$ 加 1,如果 $cnt$ 超过了 $k$,那么说明不能对原序列进行不超过 $k$ 次操作,使得序列中的最小值不小于 $x$。
以下是代码实现:
```c++
#include <iostream>
using namespace std;
const int MAXN = 1e5 + 5;
int n, k, a[MAXN];
bool check(int x) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (a[i] < x) {
cnt += x - a[i];
if (cnt > k) {
return false;
}
}
}
return true;
}
int main() {
cin >> n >> k;
int l = 0, r = 1e9, ans = -1;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
cout << ans << endl;
return 0;
}
```
时间复杂度为 $O(n\log w)$,其中 $w$ 是原序列中的最大值。
阅读全文