Codeforces Round 890 (Div. 2)
C
题意:
给你一个a数组每次操作可以选择一对\(a_i\) 和 \(a_{i + 1}\), 其中\(a_i\) \(\leq\) \(a_{i + 1}\), 最多可以进行k次操作,问最后数组里最大的一个数是多少
思路:
当k是无限的时候,对于一对符合条件的数来说最大值就是\(a_{i + 1}\) + 1, 那对于一段和符合条件的区间来说,操作之后最大值之后的数一定是依次减一的,所以对于每一个位置二分答案找到该位置最大能到多少,最后对每个位置取一个max
bool check(int i, int x)
{
int sum = 0, idx = i;
while (idx <= n)
{
if (x - (idx - i) > a[idx]) sum += x - (idx - i) - a[idx]; // 当前数可以通过一定的操作来到达目标数字
else return true; // 说明到达了区间最右端且花费不超过k
if (sum > k) return false;
idx++;
}
return false; // 最后一个数没法操作,因为 n + 1 越界
}
void solve()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int ans = -inf;
for (int i = 1; i <= n; i++)
{
int l = 1, r = 2e8;
while (l < r)
{
int mid = (l + r + 1) / 2;
if (check(i, mid)) l = mid;
else r = mid - 1;
}
ans = max(ans, l);
}
cout << ans << endl;
}

浙公网安备 33010602011771号