1170: 非常男女(XCOJ 前缀和)

1170: 非常男女

时间限制: 1 Sec  内存限制: 128 MB
提交: 22  解决: 9

题目描述

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

输入

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

    对于30%的数据,n<=100;
    对于50%的数据,n<=1 000;
    对于100%的数据,n<=100 000。

输出

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

样例输入

9
0 1 0 0 0 1 1 0 0

样例输出

6
利用前缀和计算,当满足(ans[j]-ans[i-1])*2==(j-i+1)此序列就满足要求。此时注意的是内层遍历j=i+sum+1,而不应该是j=i+1,去除不需要讨论的范围,不然会超时
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 bool a[100005];
 7 int ans[100005];
 8 int main()
 9 {
10     int i,j;
11     int n;
12     freopen("in.txt","r",stdin);
13     while(scanf("%d",&n)!=EOF)
14     {
15         int sum=0;
16         ans[0]=0;
17         for(i=1;i<=n;i++)
18         {
19             scanf("%d",&a[i]);
20             ans[i]=ans[i-1]+a[i];
21         }
22         for(i=1;i<=n;i++)
23         {
24             for(j=i+sum+1;j<=n;j+=2)
25             {
26                 if((ans[j]-ans[i-1])*2==(j-i+1))
27                     sum=max(j-i+1,sum);
28             }
29         }
30         printf("%d
",sum);
31     }
32     return 0;
33 }
原文地址:https://www.cnblogs.com/a1225234/p/5284961.html