Educational Codeforces Round 122 B. Minority

题目

给你一个字符串 s,只包含字符 ‘0’ 和 ‘1’。

您必须选择 s 的连续子字符串并从子字符串中删除所有出现的字符,这是其中的严格少数。

也就是说,如果子字符串中“0”的数量严格小于“1”的数量,则从子字符串中删除所有出现的“0”。如果“1”的数量严格小于“0”的数量,则删除所有出现的“1”。如果两者数量相同,则什么也不做。

您必须只应用一次操作。最多可以删除多少个字符?

输入
第一行包含一个整数 t (1≤t≤104)——测试用例的数量。

每个测试用例的唯一行包含一个非空字符串 s,仅由字符 ‘0’ 和 ‘1’ 组成。 s 的长度不超过 2⋅105

所有测试用例中字符串 s 的总长度不超过 2⋅105

输出
对于每个测试用例,打印一个整数——在恰好应用一次操作后可以删除的最大字符数。

题解

让我们尝试估计最大可能的答案。 最好的情况是,将能够从整个字符串中删除全零或全一。 出现次数最少的那个可以是答案。
如果字符串中 0 和 1 的数量不同,这个界限实际上很容易达到:只需选择作为整个字符串的子字符串。
如果数量相同,则不可能达到界限。 选择整个字符串不会有任何作用,而询问较小的子字符串会减少答案。
我们可以将答案减少的最小值是 1。如果您选择的子字符串是没有最后一个字符的字符串,您会将其中一个数量减少 1。 这将使两者数量不同,并且将达到界限(无论删除的是0还是1答案都会最优)。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 1;
int solve()
{
	string s; cin >> s;
	int sum1 = 0, sum0 = 0;
	if (s.size() <= 2)return 0;
	for (int i = 1; i <= s.size(); i++)
	{
		sum1++, sum0++;
	}
	if (sum1 != sum0)
		return min(sum1, sum0);
	else return sum1 - 1;
	

}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		cout << solve() << endl;
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值