硬币翻转

题目描述

从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用1表示,背面朝上的用0表示。现在要求从这行的第一个硬币开始,将前若干个硬币一起翻面,问如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?

输入格式

一个字符串,由0和1组成,表示硬币状态

输出格式

一个数,表示要翻转的最少次数

输入输出样例

输入 #1
10
输出 #1
2

说明/提示

样例1说明:

第1次翻转:把第一个硬币翻到反面,字符串为00

第2次翻转:把第一、二个硬币一起翻到正面,字符串为11,翻转完成,输出2

硬币个数<=10000

【解题思路】

读入表示硬币状态的字符串,要把硬币都翻到1。翻转有一定的规则,如果你要翻第i枚硬币,必须把1~i枚都翻转。问怎么翻才能用最少的次数得到全部为1的硬币序列。

既然是翻1~i的话,连续的0可以一次变为1,就可以当成一个0处理。但是如果0前有1,就要再操作一次把翻成0的1翻回去。当我们找到一个0,如果它前面也是0,我们可以不管它,和前面的0一起处理。如果它前面是1,就要翻2次纠正。要做到次数最少,我们就要使调整好的状态不受影响,所以应该从后向前搜索,而翻转后面的操作实际不影响前面的值,因为前面的硬币会翻2次回到原状态。最后要再判断一下第一枚硬币,如果是0再翻1次。

【code】

#include <cstdio>
#include <cstring> 
#include <iostream>
#include <algorithm>
using namespace std;
int n,ans;
char a[10005];
int main(){
    scanf("%s",a+1);
    n=strlen(a+1);
    for(register int i=2;i<=n;i++)
        if(a[i]!=a[i-1])
            ans++;
    if(a[n]=='0')ans++;
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2019-09-07 14:44  GTR_PaulFrank  阅读(1126)  评论(0编辑  收藏  举报