定义一种操作:平滑化—— b n = f ( a n ) b_n=f(a_n) bn=f(an)
具体操作:
定义一个序列 a n a_n an是稳定指 f ( a n ) = a n f(a_n)=a_n f(an)=an
给出一个01序列 a n a_n an
求出需要进行多少次平滑化后 a n a_n an是稳定的,并求出最后稳定的序列是什么
首先思考中位数
因为 a n a_n an是01序列,那么如果当前位置 i i i, a [ i − 1 ] a[i-1] a[i−1]或者 a [ i + 1 ] a[i+1] a[i+1]= a [ i ] a[i] a[i],那么 i i i这个位置是不用变的
那么把序列扩大
容易发现只有像0101010……或者1010101……这样的序列才会在平滑化发生改变
那么我们只需要暴力找10交替的序列,记录一下答案
O ( n ) O(n) O(n)暴力寻找即可
#include
#include
using namespace std;
int n,i,j,k,num,l,ans,a[500005],c[500005];
int main()
{
freopen("median.in","r",stdin);
freopen("median.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
i=1;
while (i<=n)
{
num=1;
j=i+1;
while (j<=n)
{
if ((j-i)%2==0)
{
if (a[j]!=a[i]) break;
num++;
j++;
}
else
{
if (a[j]==a[i]) break;
num++;
j++;
}
}
if (num==1) c[i]=a[i];
if (num>1&&num%2==1)
{
l=num/2;
ans=max(ans,l);
for (k=i;k<j;k++)
c[k]=a[i];
}
if (num>1&&num%2==0)
{
l=num/2-1;
ans=max(ans,l);
for (k=i;k<=i+num/2-1;k++)
c[k]=a[i];
for (k=i+num/2;k<j;k++)
c[k]=a[j-1];
}
i=j;
}
printf("%d\n",ans);
for (i=1;i<=n;i++)
printf("%d ",c[i]);
fclose(stdin);
fclose(stdout);
return 0;
}