P13500 题解
题目比较典型,一眼二分。
Part 1 思路
我们考虑答案是否具有单调性,对于
那么,我们二分了
考虑贪心策略,我们要是想让尽可能多的冰不融化,那么我们可定不会浪费每一次给冰加上
知道了这些以后,我们会发现,每次肯定是会要给前
具体的,每次把所有的数放进优先队列里,拿出前
但是我们会发现这样的复杂度太高,怎么优化呢?
我们整体地考虑,假如说
我们在前
Part 2 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e6 + 10;
ll n, k, a[M], minn, ans;
bool check(ll s) {
ll cnt = 0;
for (int i = 1; i <= n; i ++)
if (a[i] <= s)
cnt += s + 1 - a[i];
return cnt <= s * k;
}
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i ++) cin >> a[i], minn = min(a[i], minn);
ll l = minn - 1, r = 1e11;
while (l <= r) {
ll mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
l = mid + 1;
} else
r = mid - 1;
}
cout << ans << "\n";
return 0;
}
Part 3 注意事项
需要注意二分上限