CF 873 B

原题链接:

Problem - B - Codeforces

题意:

有一个长度为 n 的 01 字符串,问最长的字串 [l,r] 使得 l~r 中 0 的个数等于 1 的个数

解法:

可以把 0 看成 -1。那题目就可以转换成,最长和为 0 的字串,那就是说两点的前缀和相等。

用 vector[] 把每个前缀和的编号存进去。(可能为负数,所以可以把前缀和先加 1e5)

Code :

 # include <bits/stdc++.h>
//# define int long long
# define pb push_back
# define db double
using namespace std;
 
int n, arr[100005], s[100005], ans = 0;
 
vector <int> g[200005];
 
int main(){
	scanf("%d", &n);
	s[0] = 1e5;
	g[s[0]].pb(0);
	for (register int i = 1;i <= n;i++){
		scanf("%1d", &arr[i]);
		if (arr[i] == 0) arr[i] = -1;
		s[i] = s[i-1] + arr[i];
		g[s[i]].pb(i);
	}
	for (int i = 0;i <= 2e5;i++) if (g[i].size()) ans = max(ans, g[i][g[i].size()-1] - g[i][0]);
	cout << ans;
	return 0;
}

07-27
Codeforces Round 1490 Problem B 的题目名称为 "Balanced Remainders"。题目大意是给定一个长度为 $n$ 的数组 $a$,其中每个元素对 3 取余的结果为 0、1 或 2。目标是通过最少的操作次数使得这三个余数的数量相等。每次操作允许将某个元素的值增加 1,这会导致其对 3 取余的结果循环变化(例如,余数为 2 的元素加 1 后余数变为 0,依此类推)。 ### 解题思路 1. **统计余数分布**:首先统计余数为 0、1、2 的数量。 2. **模拟余数调整**:根据余数调整的规则,模拟如何通过最少的操作次数平衡余数分布。具体来说: - 余数 0 的元素加 1 后余数变为 1。 - 余数 1 的元素加 1 后余数变为 2。 - 余数 2 的元素加 1 后余数变为 0。 3. **循环调整**:通过循环调整余数分布,计算每一步调整所需的操作次数,并取最小值。 ### 代码示例 以下是一个实现该问题的 C++ 代码示例: ```cpp #include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } vector<int> cnt(3, 0); for (int x : a) { cnt[x % 3] += 1; } int target = n / 3; int ans = 0; // 循环调整余数分布 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { if (cnt[j] > target) { int diff = cnt[j] - target; ans += diff * i; cnt[j] -= diff; cnt[(j + 1) % 3] += diff; break; } } } cout << ans << "\n"; } return 0; } ``` ### 相关问题 1. 如何解决 Codeforces Round 1490 Problem B 的变种问题,其中目标是平衡余数为 0、1、2 的数量? 2. 在 "Balanced Remainders" 问题中,如果允许减少元素值,如何调整解法? 3. 如何优化 Codeforces Round 1490 Problem B 的时间复杂度以处理更大的输入规模? 4. 如果余数的调整规则发生变化,例如余数 0 加 1 后变为 2,该如何调整解法? 5. 如何将 "Balanced Remainders" 问题扩展到其他模数(如 4 或 5)的情况?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值