【题目描述】
在火车站的候车厅有一排狭窄的座位,连续N个座位在一条直线上。 这些座位中有一些目前被人占据,有些空着。 在了解了“社交距离”D 的重要性之后,后来的人都希望最大化 D,其中 D 是最近的两个被占用的座位之间的距离。 例如,如果座位 3 和 8 是最接近的座位,则 D=5。
最近有一个新的乘客来了想找位子坐下,他需要确定应该坐哪个以前空置的座位, 以使 D 的最终值仍尽可能大。注意:已经坐下来的乘客不能动。
【输入】
输入的第一行包含一个整数 N,表示一排上连续座位的个数。
第二行包含长度 N,分别为 0 和 1 的字符串,描述了 N 个座位中的占用情况,0 表示空座位,1 表示已被占用。
为了问题简单化,该字符串至少有一个 0,因此至少有座位让新来的乘客落座,也至少有一个 1。
【输出】
输出一个整数,表示新来的乘客落座后最大化的D。
【样例输入】
14
10001001000010
【样例输出】
2
【数据规模】
30%:N≤20;
60%:N≤5000;
100%:2≤N≤100000。
【蒟蒻的代码】
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
char c[N];
int a[N];
int read();
signed main(){
memset(a,0,sizeof(0));
int n=read(),s=0,t=0,x=0;
for(int i=1;i<=n;i++){
cin>>c[i];
if(c[i]=='0') s++;
else{
a[++t]=s;
s=0;
}
}
a[++t]=s;
if(c[1]=='1'){
a[0]=0;
x=max(x,max(a[0],a[t]));
for(int i=1;i<=t;i++){
int m=(a[i]+1)/2;
x=max(m,x);
if(i==t) continue;
x=min(a[i],x);
}
}
else{
x=max(x,max(a[1],a[t]));
for(int i=1;i<=t;i++){
int m=(a[i]+1)/2;
x=max(m,x);
if(i==1||i==t) continue;
x=min(a[i],x);
}
}
cout<<x<<endl;
return 0;
}
int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}