AcWing 562. 壁画
原题链接
中等
作者:
无双飞怪
,
2024-04-16 21:20:26
,
所有人可见
,
阅读 3
壁画:
//理解:被毁掉的墙一定只与一段还未被毁掉的墙面相邻 所以只能从两头坏
因为如果从中间坏的话,毁掉的墙就和两段为被毁掉的墙面相邻了,画了的墙是坏不掉的 只能坏没有画的墙
而由于是先画的且画一个坏一个 所以画的次数是n/2上取整
所以本题相当于问长度为(注:是长度为)n/2上取整的区间长度的最大值
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
int n,t,s[N];
char str[N];
int main()
{
cin>>t;
for(int k=1;k<=t;k++)
{
cin>>n>>str+1;
for(int i=1;i<=n;i++)
s[i]=s[i-1]+str[i]-'0';//注:不能直接读入数字而不读入字符串 因为没有空格的数字会被读成一个很大的大数
int res=0,m=(n+1)/2;//因为坏的是n/2上取整 所以窗口大小为m=(n+1)/2
for(int i=m;i<=n;i++)
res=max(res,s[i]-s[i-m]);//因为下标是从1开始的 1~m 1往前扩一个就是0
printf("Case #%d: %d\n",k,res);
}
return 0;
}