题目
White Album(WA2)决定要动画化了,所以诚招一批白学家参与工作。 现在有n个白学家站成一排,其中有冬马党(用1表示),还有雪菜党(用0表示)。为了让最后制作出来的动画不偏向于其中任何一个女主,工作组希望从中选出一段连续的区间,使得冬马党和雪菜党的人数一样多。同时人要越多越好,这样人均工作量会减少很多。 现在要求你计算最多可以招纳多少人。
输入格式:
第一行是报名参加工作的白学家人数n(1 <= n <= 100000)
第二行就是一个长度为n的字符串,只包含0(雪菜党)和1(冬马党)
输出格式:
如果不能找到满足题意的区间,就输出0,否则输出最多可以招纳的人数
输入样例1:
8
11010111
输出样例1:
4
输入样例2:
3
111
输出样例2:
0
代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
string s;
int n;
cin>>n;
cin>>s;
int a[100005]={0};
for(int i=0;i<n;i++)
if(s[i]=='0')
a[i]=-1;
else
a[i]=1;
int b[100005]={0};
for(int i=0;i<n;i++)
for(int j=0;j<=i;j++)
b[i]+=a[j];
int ans=0,l=0;
for(int i=0;i<n;i++)
if(b[i]==0)
ans=i+1;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
if(b[i]==b[j])
l=j-i;
if(ans<l)
ans=l;
}
cout<<ans<<endl;
return 0;
}
分析
-
把0看出-1,从左往右相加,如果出现相同值,说明在这一段区间是相加和为0;如输入样例1:
1 1 0 1 0 1 1 1 -->
1 1 -1 1 -1 1 1 1 -->
1 2 1 2 1 2 3 4
显然最远的两个1相距4。 -
但是当出现0时要注意了如:
1 1 0 0
1 1 -1 -1
1 2 1 0 出现0说明前面区间都满足!!!