首页 > 代码库 > “非常男女”计划 plan
“非常男女”计划 plan
“非常男女”计划 plan
【题目描述】:
Matrix67已经当过多次“媒人”了。他因此获得了许多经验。例如,距Matrix67观察,身高相近的人似乎比较合得来。
Matrix67在学校策划了一次大型的“非常男女”配对活动。对于这次活动的参与者,Matrix67有自己独特的选择方式。他希望能选择男女人数相等且身高都很接近的一些人。这种选择方式实现起来很简单。他让学校的所有人按照身高排成一排,然后从中选出连续的若干个人,使得这些人中男女人数相等。Matrix67当然希望他能选出的人越多越好。请编写程序告诉他,他最多可以选出多少人来。
【输入描述】:
第一行有一个正整数n,代表学校的人数。
第二行有n个用空格隔开的数,这些数只能是0或1,其中,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 }
“非常男女”计划 plan
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。