590 A. Median Smoothing

0 和 1 相间的字串,只有 0 和 1 相间的地方才需要修改,修改的次数就是修改最长0/1相间字串的次数,由于每次修改都是对称的,所以总的修改次数为最长字串长度的一半。


每次修改字串有两种情况,当字串首尾元素相同时,整个字串都修改为 首尾元素;当首尾元素不相同时,前一半修改为首元素,后一般修改为尾元素。

代码如下:

#include <iostream>
using namespace std;
int main() 
{
	int n,num,i,j,k,l,maxval=-999,len;
	cin>>n;
	bool *vec=new bool[n],val,val2;
	char ch;
	for(i=0;i<n;++i)
	{
		cin>>ch;
		vec[i] = ch-'0';
	}
	num = n-1;
	for(i=0;i<num;++i)
	{
		j = i;   // i 为 0/1 相间子串的起始位置,
		while(j<num&&vec[j]!=vec[j+1]) //要找到相间子串的最后位置,用 j 表示  
			++j;
		val = vec[i];  // 保存 前一半子串要赋值的 
		if(vec[i]==vec[j])  // 如果首尾元素相同,那么前一半和后一半要赋的值一样 
			val2 = val;
		else    //否则, 后一半要赋的值为尾元素 
			val2 = vec[j];
		for(k=i+1,l=j-1;k<=l;++k,--l) // 前一半元素从前往后赋值,后一半元素从后往前赋值 
		{
			vec[k] = val;
			vec[l] = val2;
		}
		len = j-i; // 求最大子串长度 
		if(len>maxval)
			maxval = len;
		i = j;  // 从 子串 的后面开始找 
	}
	cout<<maxval/2<<endl;  // 最长 0/1 相间子串长度的一半为修改次数 
	for(i=0;i<n;++i)
		cout<<vec[i]<<" ";
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值