• CodeForces 590A


    题意:给你一个含有n个数的数组a,a的值只有0和1;有一个变换规则的到数组b,规则为:

    1) b[1]=a[1],b[n]=a[n];

    2) b[i]=中位数(a[i-1],a[i],a[i-1]);

    b数组继续变换下去,直到得到的数组与原数组一样,输出需要经过几次变换,如果无解则输出-1;

    题解:此题没有无解的情况,可以看出数组中只有出现如下两种情况可以变换

    1 0 1 -->1 1 1

    0 1 0 -->0 0 0

    因此,只要从起点s开始往后寻找到一个终点e,使得a[e]=a[e+1]或者e=n,s到e这一段的最终结果就可以求出来,结果如下:

    1)a[s]=a[e]  s到e这段均为a[s];

    2) a[s]!=a[e]  s到mid为a[s], mid+1到e为a[e] (mid=(s+e)/)2;

    步骤均为(s+e)/2-s;

    如下例子

    原数组  0 1 0 1 0

    第一步  0 0 1 0 0

    第二部  0 0 0 0 0

    step=(5+1)/2-1=2;

    因此可以把a数组划分为多个如上的数组,取其中一个的步骤最大值即可,具体看代码:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    int a[500000];
    int b[500000];
    
    int solve(int l,int r)
    {
        if(l==r) return 0;
        if(a[l]==a[r])
        {
            for(int i=l;i<=r;i++)
                a[i]=a[l];
        }
        else
        {
            int mid=(l+r)/2;
            for(int i=l;i<=mid;i++)
                a[i]=a[l];
            for(int i=r;i>mid;i--)
                a[i]=a[r];
        }
        return (l+r)/2-l;
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        int s=0,ans=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]==a[i+1] || i==n-1)
            {
                ans=max(ans,solve(s,i));
                s=i+1;
            }
        }
        printf("%d
    ",ans);
        for(int i=0;i<n-1;i++)
            printf("%d ", a[i]);
        printf("%d
    ", a[n-1]);
        return 0;
    }
  • 相关阅读:
    Java知识汇总第二天
    jvm学习笔记
    java知识汇总的第一天
    全链路压测流量模型
    FunTester测试框架Redis性能测试实践
    FunTester抄代码之路
    Jira API的踩坑记
    把工作讲给家人听
    颇具年代感的《JMeter中文操作手册》
    FunTester框架Redis压测预备
  • 原文地址:https://www.cnblogs.com/mgxj/p/5528635.html
Copyright © 2020-2023  润新知