1208. 翻硬币

状态数为\(2^{100-1}\),显然不能用二进制枚举了。

观察到下列性质:

  • 交换区间反转的顺序对最终结果是没有影响的
  • 对同一个区间进行两次以上的反转是多余的

由此,问题就转化成立求需要被反转的区间的集合。

我们先考虑一下最左端的硬币,包含该硬币的区间只有一个,因此如果该硬币和目标状态一致,我们就不需要反转第一个区间。

反之第一个区间需要反转,而且在此之后这个最左的全进就不需要再考虑了。

这样一来,通过首先考虑最左端的硬币,问题的规模缩小了1.不断重复下去,就可以求出最少需要反转的次数了。

string a,b;
int n;

int main()
{
    cin>>a>>b;
    
    n=a.size();
    int cnt=0;
    for(int i=0;i<n-1;i++)
    {
        if(a[i] != b[i])
        {
            cnt++;
            a[i]=(a[i]=='*'?'o':'*');
            a[i+1]=(a[i+1]=='*'?'o':'*');
        }
    }
    cout<<cnt<<endl;
}
posted @ 2021-01-24 10:20  Dazzling!  阅读(51)  评论(0编辑  收藏  举报