CodeForces 604C 【思维水题】`

题意:

给你01字符串的长度再给你一个串。

然后你可以在这个串中选择一个起点和一个终点使得这个连续区间内所有的位取反。

求:

经过处理后最多会得到多少次01变换。

例如:0101是4次,0001是2次,000110是3次。

分析:

区间内部的数目是不会发生变化的,因为每一位都是按位取反,相当于都没变,唯一发生变化的是区间边缘,所以考虑到连续的两个或多个1或者0的时候在其中某处设置断点会使得变换次数增加,很容易理解当某处有两个连续点的时候变换次数增加1,因为一个区间只有两个端点所以变换次数最多增加两次。

——————————————————————————————————————————

以上是屌丝一开始的思维,所以开始写码....

代码过了...但是发现一个问题...

当连续的3个或者3个以上点的时候把区间设置在这些连续点的内部可以增加的变换次数直接+2...

再看屌丝自己的代码...奥发现代码跟原来的想法根本不一样,只是恰好在连续的三个或者三个以上的时候设置了正确的标志变量...

#include<stdio.h>
int tmp[100500];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%1d",&tmp[i]);
    }
    int ans=1,ttt=1;
    bool ok=0,ook=0;
    for(int i=2;i<=n;i++)
    {
        if(tmp[i]==tmp[i-1])
        {
            ttt++;
            if(ttt>=2)//代码的bug成了简化代码的手段...
            {
                if(!ok)
                    ok=1;
                else
                  ook=1;
            }
        }
        else
        {
            ttt=1;
            ans++;
        }
    }
    printf("%d
",ans+ok+ook);
}
原文地址:https://www.cnblogs.com/tun117/p/5051228.html