开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
[种树]
链接:ac.nowcoder.com/acm/problem…
来源:牛客网
题目描述
牛牛有 n 块地,这 n 块地排在一条直线上,自左到右编号为 1...n 。牛牛想把这 n 块地全种满树。
如果第 i 块地上有树, 那牛牛就可以从这块地开始种树,但是牛牛只能沿着一个方向走。也就是说,如果牛牛打算在第 j (1 ≤ j ≤ n, j ≠ i) 块地结束今天的种树之旅,那他只能沿着从 i 块地到 j 块地的方向前进,途中不能回头。到达 j 块地后牛牛就可以回家,然后第二天重新选择一块有树的地开始。
请注意一个地方可以种多棵树。
现在牛牛想知道,最少几天可以让 n 块地全种满树。
输入描述:
第一行一个正整数 n (1 ≤ n ≤ 10_5),表示牛牛有 n 块地。
第二行一个长度为 n 的字符串 s,保证s_i ∈ {0,1},如果 s_i = 1, 则说明第 i 块地有一棵树;否则,第 i 块地没有树。
数据保证至少有一块地有一棵树。
输出描述:
一个整数,表示牛牛把树种满所需要的最小天数。
示例1
输入
7
0111110
输出
2
思路
首先看题,输出最小天数,一般最大最小,大部分情况都是贪心。那么我们就从贪心来看这个题,怎么贪捏?就是看到底怎么种树?怎么才能在一天内多种一些树捏?仔细想想,满足种树条件是什么呢?就是要在一天内沿一个方向把所有能种的树都种完。那么仔细考虑一下就可以知道只有三种情况,要么0天,要么1天,要么2天。0天就是不需要种树,1天就是刚好从头种到尾或者尾种到头,或者是开始种的位置前面都是0,那么两天就是在中间左右种树,那么列举一下情况,找一下第一个为1的点,然后往后遍历,然后输出各种情况就可以啦。(唔,写到这突然觉得不是很像贪心,更像思维题qwq)
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int n;
cin>>n;
string s;
cin>>s;
int cnt=0;
int flag=-1;
for(int i=0;i<s.size();i++){
if(s[i]=='1')cnt++;
}
for(int i=0;i<s.size();i++){
if(s[i]=='1'){
flag=i;
break;
}
}
int flag1=0;
for(int i=flag;i<s.size();i++){
if(s[i]=='1'){
flag1=i;
}
}
if(cnt==s.size())cout<<0<<endl;
else if(flag==0||flag1==s.size()-1)cout<<1<<endl;
else if(flag>0)cout<<2<<endl;
return 0;
}