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;
}
posted @ 2023-08-10 00:51  自动机  阅读(19)  评论(0)    收藏  举报