E. Making Anti-Palindromes

文章讨论了如何使用贪心策略解决Codeforces的一道问题,即判断数组是否能通过特定操作变为全0。关键在于检查最大值是否小于等于数组元素之和的一半,这是数组可以变为全0的必要条件。代码实现中涉及到了对数组的遍历、哈希映射以及条件判断来确定答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:Problem - 1822E - Codeforces (Unofficial mirror by Menci)

贪心的思路:

我们可以考虑贪心地进行操作,每次将数组中最大的数和除最大数外最大的数进行减1操作,直到所有数相等为止。这样的操作方式可以使得数组尽可能快地达到最终状态。

因此,我们只需要判断数组中的最大值与数组所有元素之和的关系即可:

如果最大值小于等于数组元素之和的一半,那么可以进行操作使得数组最终都为0。

否则,无论如何都无法将数组变为全0状态。

因为每次操作最多只会减少两个元素之和1,而最大值与数组之和的差值必然大于等于数组元素个数,所以无论如何都无法完成将数组变为全0状态的操作。

因此,满足最大值小于等于数组元素之和的一半是数组可以最终都变为0的必要条件。

剩下的数为:max(2*maxx-(sum),(sum)%2)

void solve()
{
	int n;
    string s;
    cin>>n>>s;
	if(n&1)
	{
		cout<<-1<<endl;
	}
	else
	{
		map<int,int>h,k;		
        s=' '+s;
		int cnt=0,flag=0;
		for(int i=1;i<=n;i++)
		{
			h[s[i]]++;
			if(h[s[i]]>n/2)flag++;
		}
		for(int i=1;i<=n/2;i++) 
		{
			if(s[i]==s[n-i+1])k[s[i]]++,cnt++;
		}
		if(flag)
		{
			cout<<-1<<endl;
		}
		else if(cnt==0)
		{
			cout<<0<<endl;
		}
		else
		{
			for(auto i:k)
			{
				if(i.y*2>cnt)
				{
					cout<<i.y<<endl;
					return ;
				}
			}
			cout<<(cnt+1)/2<<endl;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值