590 A. Median Smoothing

来源:互联网 发布:排名优化软件点击 编辑:程序博客网 时间:2024/05/19 03:24

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