• 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 }
  • 相关阅读:
    swift5.x for-in, switch语句
    swift5.x 数组(Array)的基本操作
    OC NSDictionary的属性一般为什么要设置为copy
    iOS APP 从编译到运行
    重装win10系统之后,如何使用之前的虚拟机
    [Delphi]接口认识
    [QPlugins]学习大纲
    [QPlugins]概述
    [转发]Oauth 1.0 1.0a 和 2.0 的之间的区别有哪些?
    [Delphi] Webbroker ISAPI 示例说明
  • 原文地址:https://www.cnblogs.com/a1225234/p/5284961.html
Copyright © 2020-2023  润新知