题目描述
从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用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;
}