种树(牛客练习)

题目描述:


牛牛有 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;
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值