题目背景
难度系数:☆☆☆☆☆(如果你看懂了)
题目描述
从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用1表示,背面朝上的用0表示。现在要求从这行的第一个硬币开始,将n个硬币(1<=n<=硬币个数)一起翻面,问如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?
输入输出格式
输入格式:
一个字符串(当然不限长度,在字符串范围之内),有0和1组成
输出格式:
要翻转的最少次数
输入输出样例
输入样例#1:
10
输出样例#1:
2
说明
样例1说明:
第1次翻转:把第一个硬币翻到反面,字符串为00
第2次翻转:把第一、二个硬币一起翻到正面,字符串为11,翻转完成,输出2
思路
除了开头是0只加上1,其他的就是0的块块数量*2。。。
好贪心啊表示这不是BFS题吗哈哈哈。。。
被我给水过了哈哈。。。
代码
很清真
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e6+5;
char s[N];
int n,num[N],pos,tot=0;
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
for (int i=1;i<=n;i++)
num[i]=s[i]-'0';
int flag=0,now=0;
if (num[n]==0) tot++;
if (num[1]==0) now=1;
for (int i=1;i<=n;i++)
{
if (num[i]==0) flag=1;
if (flag==1&&num[i]==1) {flag=0;tot++;}
}
printf("%d\n",tot*2-now);
return 0;
}
//10001001