要把加速器每分钟的贡献看成k-1,1 1 1 k 1 1 k,这样可通过时间来确定具体需要干燥几次。
还有k=1时,贡献为1,需要特判
const int N = 1e5 + 5;
int t;
int n, k;
int a[N];
bool judge(ll mid)
{
//计算需要干燥几次 这里加速器的效果是真实效果是k-1,因为在自然状态-1/min
ll cot = 0;
f(i, 1, n)
{
if (a[i] > mid)
cot += (ll)ceil((a[i] - mid)*1.0 / (k - 1));
if (cot > mid)return false;//需要干燥的次数超过时间
}
return true;
}
int main()//二分时间,假设用x分钟,扫一遍看看不能在x分钟内自然干燥的次数是不是小于x
{
cin >> n;
int mx = 0;
f(i, 1, n) { scanf("%d", &a[i]);mx = max(mx, a[i]); }
cin >> k;
if (k == 1) { cout << mx << endl;return 0; }
int l = 1, r = 1e9;
int ans;
while (l <= r)
{
int mid = (l + r) / 2;
if (judge(mid)) { ans = mid;r = mid-1; }
else l = mid+1;
}
cout << ans << endl;
return 0;
}