首页 > 其他 > 详细

落谷P1114 “非常男女”计划

时间:2020-03-29 16:42:04      阅读:60      评论:0      收藏:0      [点我收藏+]

原题链接: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.

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

落谷P1114 “非常男女”计划

原文:https://www.cnblogs.com/sy666/p/12589580.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!