首页 > 代码库 > “非常男女”计划 plan

“非常男女”计划 plan

“非常男女”计划 plan

【题目描述】:

Matrix67已经当过多次“媒人”了。他因此获得了许多经验。例如,距Matrix67观察,身高相近的人似乎比较合得来。

Matrix67在学校策划了一次大型的“非常男女”配对活动。对于这次活动的参与者,Matrix67有自己独特的选择方式。他希望能选择男女人数相等且身高都很接近的一些人。这种选择方式实现起来很简单。他让学校的所有人按照身高排成一排,然后从中选出连续的若干个人,使得这些人中男女人数相等。Matrix67当然希望他能选出的人越多越好。请编写程序告诉他,他最多可以选出多少人来。

 

【输入描述】:

第一行有一个正整数n,代表学校的人数。

第二行有n个用空格隔开的数,这些数只能是01,其中,0代表一个女生,1代表一个男生。

 

【输出描述】:

输出一个非负整数。这个数表示在输入数据中最长的一段男女人数相等的子序列长度。

如果不存在男女人数相等的子序列,请输出0

 

【样例输入】

【样例输出】

9

0 1 0 0 0 1 1 0 0

6

【数据范围及描述】:

    对于30%的数据,n<=100

    对于50%的数据,n<=1 000

    对于100%的数据,n<=100 000

 

稍微考一点思维!

技术分享
 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6  7 const int maxn=100005; 8 int N; 9 int pos[maxn];10 int rpos[maxn];11 12 int main()13 {14     scanf("%d",&N);15     int ans=0,sum=0,a,p;16     memset(pos,-1,sizeof(pos));17     memset(rpos,-1,sizeof(rpos));18     pos[0]=0;19     for(int i=1;i<=N;i++)20     {21         scanf("%d",&a);22         if(a==1) sum++;23         else sum--;24         if(sum>=0)25         {26             if(pos[sum]!=-1) ans=max(i-pos[sum],ans);27             else pos[sum]=i;28         }29         else30         {31             p=-sum;32             if(rpos[p]!=-1) ans=max(i-rpos[p],ans);33             else rpos[p]=i;34         }35     }36     printf("%d",ans);37     return 0;38 }
View Code

 

“非常男女”计划 plan