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

    原题链接:https://www.luogu.com.cn/problem/P1114

    对于这道题,可以处理出来每前i个数男生数量比女生数量多的数k,在用b1[k]存储最小的i使得男生比女生多k个,b2[k]存储最大的i使得男生比女生多k个。

    然后计算所有的k,b2[k]-b1[k],求出最大值,即为最终结果。

    代码:

    c:

    #include<stdio.h>
    #define M 0x7fffffff 
    int b1[200001],b2[200001],n,c,maxx,minn,k,ans;
    int main(){
        k=0;minn=M;maxx=M+1;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&c);
            if(c)k++;else k--;//当读到第i个数时男生比女生多k个。
            if(k>maxx)maxx=k;//算出k中的最大值。
            if(k<minn)minn=k;//算出k中的最小值。
            if(b1[k+100000]==0)b1[k+100000]=i;//因为c中数组是0开始的,所以存储时要加100000。
            b2[k+100000]=i;
        }
        b1[100000]=0;//设前0个人的男女生数量相等,方便下面计算
        ans=0;
        for(int i=minn+100000;i<=maxx+100000;i++)
            if(b2[i]-b1[i]>ans)ans=b2[i]-b1[i];//求出最大的ans
        printf("%d",ans);
        return 0;
    }

    pascal:

    var
        b1,b2:array [-100000..100000]of longint;
        n,c,maxx,minn,k,ans,i:longint;
    begin
        k:=0;minn:=2147483647;maxx:=-minn-1;
        readln(n);
        for i:=1 to n do begin
            read(c);
            if c<>0 then k:=k+1 else k:=k-1;//当读到第i个数时男生比女生多k个。
            if k>maxx then maxx:=k;//算出k中的最大值。
            if k<minn then minn:=k;//算出k中的最小值。
            if b1[k]=0 then b1[k]:=i;
            b2[k]:=i;
        end;
        b1[0]:=0;//设前0个人的男女生数量相等,方便下面计算
        ans:=0;
        for i:=minn to maxx do
            if b2[i]-b1[i]>ans then ans:=b2[i]-b1[i];//求出最大的ans
        writeln(ans);
        exit();
    end.

    我可能写的不好,如果有问题,请帮忙指出,谢谢。

  • 相关阅读:
    HBase 数据模型和架构
    Flume 自定义Sink
    Flume 自定义Source
    LuoguP5889 跳树 线段树
    线段树历史版本和
    LuoguP4183 [USACO18JAN]Cow at Large P 点分治+树状数组+prufer序列
    LuoguP3924 康娜的线段树 期望+线段树
    luoguP3710 方方方的数据结构 KDtree
    luoguP5154 数列游戏 区间DP
    LOJ#2206. 「HNOI2014」世界树 虚树+倍增
  • 原文地址:https://www.cnblogs.com/sy666/p/12589580.html
Copyright © 2011-2022 走看看