题目描述
在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,
要求每位观众的必须间隔至少一个空位才允许落座。
现在给出一排观众座位分布图,座位中存在已落座的观众,请计算出,
在不移动现有观众座位的情况下,最多还能坐下多少名观众。
输入描述
一个数组,用来标识某一排座位中,每个座位是否已经坐人。
- 0表示该座位没有坐人,1表示该座位已经坐人。
- 1 ≤ 数组长度 ≤ 10000
输出描述
整数,在不移动现有观众座位的情况下,最多还能坐下多少名观众。
用例1
输入
10001
输出
1
说明
无
用例2
输入
0101
输出
0
用例3
输入
0010100
输出
2
考点
逻辑思维
解题思路
1.将字符串按1进行分割,存下来每个间隔内0的个数。
2.计算每个间隔内的0能坐几人,如果不是首尾部的零,则能坐(m-1)/2人,m是0的个数。
3.如果是首尾部的零,且第一或最后一个字符为0,则用公式m/2。
代码
c++
#include <bits/stdc++.h>
using namespace std;
//返回被1隔开的0的个数数组
vector<int> split(string cp) {
vector<int> vec;
while(cp.find('1')!=cp.npos) {
int pos=cp.find('1');
string tmp=cp.substr(0,pos);
if(tmp.size()>0){
vec.push_back(tmp.size());
}
cp=cp.substr(pos+1);
}
if(cp.size()>0)
vec.push_back(cp.size());
return vec;
}
int main()
{
string s;
getline(cin, s);
int n=s.size();
vector<int> vec=split(s);
int res=0;
for(int i=0;i<vec.size();i++) {
if(i==0 && s[0]=='0'){
res+=vec[i]/2;
continue;
}
if(i==vec.size()-1 && s[n-1]=='0'){
res+=vec[i]/2;
continue;
}
res+=(vec[i]-1)/2;
}
cout<<res<<endl;
system("pause");
return 0;
}
java
import java.util.Scanner;
public