zoukankan      html  css  js  c++  java
  • [洛谷P1114] “非常男女”计划

    题目描述

    近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验。例如,据他观察,身高相近的人似乎比较合得来。

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

    输入输出格式

    输入格式:

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

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

    输出格式:

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

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

    输入输出样例

    输入样例#1:
    9
    0 1 0 0 0 1 1 0 0
    
    输出样例#1:
    6

    思路

    引入一个叫相对差的东西;
    用s数组记录相对差;
    规定s[0]=0;
    男生对s的贡献为,女士为-1;
    如果s[i]==s[j],区间[i+1,j]符合要求;

    代码实现

     1 #include<cstdio>
     2 const int maxn=1e5+10;
     3 inline int max_(int x,int y){return x>y?x:y;}
     4 int n,a,s[maxn],f[maxn<<1],ans;
     5 int main(){
     6     scanf("%d",&n);
     7     for(int i=1;i<=n;i++){
     8         scanf("%d",&a);
     9         if(a) s[i]=s[i-1]+1;
    10         else s[i]=s[i-1]-1;
    11     }
    12     for(int i=1;i<=n;i++){
    13         if(!f[s[i]+maxn]&&s[i]) f[s[i]+maxn]=i; 
    14         else ans=max_(ans,i-f[s[i]+maxn]);
    15         
    16     }
    17     printf("%d
    ",ans);
    18     return 0;
    19 }
     
  • 相关阅读:
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    72. Edit Distance
    583. Delete Operation for Two Strings
    582. Kill Process
    indexDB基本用法
    浏览器的渲染原理
    js实现txt/excel文件下载
    git 常用命令
    nginx进入 配置目录时
  • 原文地址:https://www.cnblogs.com/J-william/p/7077356.html
Copyright © 2011-2022 走看看