发现规律&&codeforce 590A

这个题没有用到什么定理函数之类的,有的只是要学会发现规律,题目最直观的解法很有可能会超时,从另一个角度来说,这也不利于我们的训练。
通过不断地尝试,我们可以发现:
1、类似于010101,最后是000111,也就是说前一半的值等于第一个,后一半的值等于最后一个
2、类似于01010,即首尾相同,那么最后结果是00000;而10101,结果是11111
3、我们在这里把这样的串称为重要字串,可以发现在重要字串A+00+重要字串B中,AB互不影响
4、不会出现不稳定的串
5、最后的变化次数与最长的重要字串的长度-2(去掉首尾项,记做len)有关,这里记做res

#include <iostream>
using namespace std;
int n;
int a[500005];
int b[500005];
int main()
{
    cin>>n;
    int i,j,len,res=0;
    for(i=0;i<n;i++)
        cin>>a[i];
    for(i=0;i<n;i++)
    {
        for(j=i;j<n-1;j++)
        {
            if(a[j]==a[j+1]) break;//定位到重要字串的最后一个位置j
        }
        if(a[j]==a[i])//if-else是对重要字串进行改变字符的操作
            for(int m=i;m<=j;m++) b[m]=a[i];
        else
        {
            for(int m=i;m<=(i+j)/2;m++) b[m]=a[i];
            for(int m=(i+j)/2+1;m<=j;m++) b[m]=a[j];
        }
        len=j-i-1;
        if(len>res) res=len;
        i=j;
    }
    cout<<(res%2+res/2)<<endl;//容易发现答案就是这个式子
    for(i=0;i<n-1;i++) cout<<b[i]<<' ';
    cout<<b[i];
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值