码迷,mamicode.com
首页 > 其他好文 > 详细

“非常男女”计划 plan

时间:2016-09-15 13:43:07      阅读:401      评论:0      收藏:0      [点我收藏+]

标签:

“非常男女”计划 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         else
30         {
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

标签:

原文地址:http://www.cnblogs.com/cnblogsLSY/p/5874647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!