- 近来,蒜头君致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验。例如,据他观察,身高相近的人似乎比较合得来。
- 万圣节来临之际,蒜头君准备在学校策划一次大型的“非常男女”配对活动。对于这次活动的参与者,蒜头君有自己独特的选择方式。他希望能选择男女人数相等且身高都很接近的一些人。这种选择方式实现起来很简单。他让学校的所有人按照身高排成一排,然后从中选出连续的若干个人,使得这些人中男女人数相等。为了使活动更热闹,蒜头君当然希望他能选出的人越多越好。请编写程序告诉他,他最多可以选出多少人来。
-
输入格式
- 第一行有一个正整数 n (1≤n≤100000),代表学校的人数。
- 第二行有 n 个用空格隔开的数,这些数只能是 0或 1,其中0 代表一个女生,1代表一个男生。
- 输出格式
- 输出一个非负整数,这个数表示在输入数据中最长的一段男女人数相等的连续子序列长度。
- 样例输入
- 9
- 0 1 0 0 0 1 1 0 0
- 样例输出
- 6
- 代码
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n;//人数 cin>>n; vector <int> a(n);//输入数据,男生为1 女生为0 vector <int> b(n);//新数组,将女生看成-1 int num=0; for(int i=0;i<n;i++){ cin>>a[i]; if (a[i]==0) { b[i]=a[i]-1; num++;//记录0的个数,如果全部为0,则直接输出0 } else b[i]=a[i]; } vector <int> sum(n);//存储前缀和 sum[0]=a[0]; for(int i=1;i<n;i++) sum[i]=sum[i-1]+b[i];//前缀和 //特殊情况,全部是男生或者全部是女生 if(num==n||sum[n-1]==n){ cout<<0<<endl; return 0; } int MAX=0;//最大值 int cnt=0; const int sti=n; for(int i=0;i<n;i++){ if(i>n-MAX){//加这个条件会少处理一些,节约时间 cout<<MAX<<endl; return 0; } for(int j=n-1;j>=0;j--){ //从女孩开始的情况 if(b[i]==-1){ //不带b[i] //如:10 //0 0 0 0 0 1 1 1 1 0 if(sum[i]==sum[j]){ cnt=j-i; MAX=max(cnt,MAX); //cout<<MAX<<endl; //return 0; break; } //带上b[i] //如:10 //0 1 0 1 0 1 0 1 0 1 if(sum[i]==sum[j]-1){ cnt=j-i+1; MAX=max(cnt,MAX); break; } } else if(b[i]==1){//从男孩开始 if(sum[i]==sum[j]+1){ cnt=j-i+1; MAX=max(cnt,MAX); //cout<<MAX<<endl; //return 0; break; } } } } //cout<<MAX<<endl; return 0; }