codeforcesB. Vika and the Bridge

文章讲述了如何解决一个基于颜色跳跃的游戏问题,玩家在不同颜色的板子上移动,可以改变一块板子的颜色。通过二分查找和计算每个板子的最大跳跃距离,以及考虑一次将最大距离减半的机会,找到最小的可达距离。代码示例展示了整个解题思路。
摘要由CSDN通过智能技术生成

Problem - B - Codeforces

翻译来源:Vika and the Bridge - 洛谷 

首先,我想到了二分答案的方法,但写不出check函数,如果有大佬愿意的话,希望能够分享一下。

之后,我们可以分析题意得知,这是从0~n+1这么多个位置进行跳跃,每一次都只能跳到颜色相同的板子上面,但我们能够将其中一块板子的颜色更改掉。

于是,我们自然想到了将每一个板子的最大跳跃距离都求出来,然后通过更新找到最大值最小。

怎么求出每一个板子的最大跳跃距离呢?

实际上我们只需要不断枚举更新即可。

但别忘了我们还有一次将最大距离变为二分之一的机会,所以我们还需要求出次大距离,那么在掌握这些之后,所有就易如反掌了。

细节问题,我们还要注意这是从0~n+1的问题,如果我们不注意N+1与上一个木板的间隔的话,就会wa.,

嗯,没了。

#include <bits/stdc++.h>
using namespace std;
const int N = 200050;
int a[N];
int maxju[N];
int cimax[N];
int last[N];

int main() {
	int t;
	cin >> t;
	while (t--) {
		int n, k;
		cin >> n >> k;
		for (int i = 1; i <= k; i++) {
			last[i] = 0;
			maxju[i] = 0;
			cimax[i] = 0;
		}

		for (int i = 1; i <= n; i++)
			cin >> a[i];
		for (int i = 1; i <= n; i++) {
			if (i - last[a[i]] - 1 > maxju[a[i]]) {
				cimax[a[i]] = maxju[a[i]];
				maxju[a[i]] = i - last[a[i]] - 1;
			} else if (i - last[a[i]] - 1 > cimax[a[i]])
				cimax[a[i]] = i - last[a[i]] - 1;
			last[a[i]] = i;
		}
		for (int i = 1; i <= k; i++) {
			if (n + 1 - last[i] - 1 > maxju[i]) {
				cimax[i] = maxju[i];
				maxju[i] = n + 1 - last[i] - 1;
			} else if (n + 1 - last[i] - 1 > cimax[i])
				cimax[i] = n + 1 - last[i] - 1;
		}
		for (int i = 1; i <= k; i++) {
			maxju[i] /= 2;
			maxju[i] = max(maxju[i], cimax[i]);
		}
		int ans = n;
		for (int i = 1; i <= k; i++) {

			ans = min(ans, maxju[i]);
		}
		cout << ans << "\n";

	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值