思路:我们可以通过二分可以组成的方案数,然后判断函数可以通过构造搞出来。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define MAXN 10100
#define MAXE 5
#define INF 1e9
#define MOD 100003
#define LL long long
#define ULL unsigned long long
#define pi 3.14159
using namespace std;
LL n, m;
LL arr[MAXN];
bool check(LL mid) {
LL temp = min(m, mid);
for (int i = 1; i <= n; ++i) {
if (mid > arr[i]) {
temp -= (mid - arr[i]);
}
if (temp < 0) {
return false;
}
}
return true;
}
int main() {
std::ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
}
LL left = 0, right = 1e9;
LL mid = (left + right) / 2;
for (int i = 0; i < 100; ++i) {
if (check(mid)) {
left = mid;
} else {
right = mid;
}
mid = (left + right) / 2;
}
cout << mid << endl;
return 0;
}