三十年河东,三十年河西|

自动机

园龄:1年10个月粉丝:2关注:4

Codeforces Round 890 (Div. 2)

C

题意:

给你一个a数组每次操作可以选择一对aiai+1, 其中ai ai+1, 最多可以进行k次操作,问最后数组里最大的一个数是多少

思路:

k是无限的时候,对于一对符合条件的数来说最大值就是ai+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;
}

本文作者:自动机

本文链接:https://www.cnblogs.com/monituihuo/articles/17615735.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   自动机  阅读(3)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起