标签:落谷 P1114 minn maxx 男女 b1 b2 ans 男生
原题链接: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,minn,maxx,男女,b1,b2,ans,男生 来源: https://www.cnblogs.com/sy666/p/12589580.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。