站外题求助
  • 板块题目总版
  • 楼主484A51
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/8/24 14:30
  • 上次更新2023/11/4 09:13:09
查看原帖
站外题求助
180246
484A51楼主2021/8/24 14:30

【题目描述】
在火车站的候车厅有一排狭窄的座位,连续N个座位在一条直线上。 这些座位中有一些目前被人占据,有些空着。 在了解了“社交距离”DD 的重要性之后,后来的人都希望最大化 DD,其中 DD 是最近的两个被占用的座位之间的距离。 例如,如果座位 3 和 8 是最接近的座位,则 D=5D=5
最近有一个新的乘客来了想找位子坐下,他需要确定应该坐哪个以前空置的座位, 以使 DD 的最终值仍尽可能大。注意:已经坐下来的乘客不能动。

【输入】
输入的第一行包含一个整数 NN,表示一排上连续座位的个数。
第二行包含长度 NN,分别为 0 和 1 的字符串,描述了 NN 个座位中的占用情况,0 表示空座位,1 表示已被占用。
为了问题简单化,该字符串至少有一个 0,因此至少有座位让新来的乘客落座,也至少有一个 1。

【输出】
输出一个整数,表示新来的乘客落座后最大化的DD

【样例输入】

14
10001001000010

【样例输出】

2

【数据规模】
30%30\%N20N \le 20
60%60\%N5000N \le 5000
100%100\%2N1000002 \le N \le 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;
}
2021/8/24 14:30
加载中...