题目描述:
牛牛有 nnn 块地,这 nnn 块地排在一条直线上,自左到右编号为 1...n1...n1...n 。牛牛想把这 nnn 块地全种满树。
如果第 iii 块地上有树, 那牛牛就可以从这块地开始种树,但是牛牛只能沿着一个方向走。也就是说,如果牛牛打算在第 j(1≤j≤n,j≠i)j (1 \leq j\leq n,j\neq i)j(1≤j≤n,j=i) 块地结束今天的种树之旅,那他只能沿着从 iii 块地到 jjj 块地的方向前进,途中不能回头。到达 jjj 块地后牛牛就可以回家,然后第二天重新选择一块有树的地开始。
请注意一个地方可以种多棵树。
现在牛牛想知道,最少几天可以让 nnn 块地全种满树。
输入:
第一行一个正整数 n(1≤n≤105)n(1\leq n\leq 10^5)n(1≤n≤105),表示牛牛有 nnn 块地。
第二行一个长度为 nnn 的字符串 sss,保证si∈{0,1}s_i \in\{ 0,1\}si∈{0,1},如果 si=1s_i = 1si=1, 则说明第 iii 块地有一棵树;否则,第 iii 块地没有树。
数据保证至少有一块地有一棵树。
输出:
一个整数,表示牛牛把树种满所需要的最小天数。
样例:
输入:
7
0111110
输出:
2
经分析可以发现:只有三种情况:当全部都为1时,需要0天; 当开始为0的时,最后不为0时,需要1天,例:011101,直接从后面往前即可;当开始为0最后一个也为0时,需要2天,例:011110,这样两个0必须两次才能种上。注意思路就行了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
char s[100010];
int main() {
int n,flag=0;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i];
if (s[i] == '0')
flag = 1;
}
if (s[1] == '0' && s[n] == '0')
cout << "2" << endl;
else if (flag == 0)
cout << "0" << endl;
else
cout << "1" << endl;
return 0;
}