您的位置:首页 > 其它

590 A. Median Smoothing

2015-11-14 15:48 267 查看
找 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
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: