- 答えの値で二分探索を行った
- 初めkの値の意味を取り違えており、毎ターンk+1乾燥させるようにしていた。WA
- 入力の直後に--kしたら、0割りでRE
- k==1の場合は自然乾燥させる場合と等価になるので、max_elementを返せば良い
static int a[128 * 1024];
bool check(int n, int k, int m)
{
ll needed = 0;
for (int i = 0; i < n; ++i) {
int rest = a[i] - m;
if (rest < 0) {
rest = 0;
}
needed += (rest + k - 1) / k;
}
return needed <= m;
};
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int k;
scanf("%d", &k);
--k;
if (k == 0) {
cout << *max_element(a, a + n) << endl;
return 0;
}
int L = 0;
int R = 1LL << 30;
while (L + 1 < R){
int M = (L + R) / 2;
if (check(n, k, M)){
R = M;
} else {
L = M;
}
}
cout << L + 1 << endl;
}