如何用电话号码找人:一道pascal题

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/29 12:03:31
描述 Description
Matrix67已经当过多次“媒人”了。他因此获得了许多经验。例如,距Matrix67观察,身高相近的人似乎比较合得来。
Matrix67在学校策划了一次大型的“非常男女”配对活动。对于这次活动的参与者,Matrix67有自己独特的选择方式。他希望能选择男女人数相等且身高都很接近的一些人。这种选择方式实现起来很简单。他让学校的所有人按照身高排成一排,然后从中选出连续的若干个人,使得这些人中男女人数相等。Matrix67当然希望他能选出的人越多越好。请编写程序告诉他,他最多可以选出多少人来。

输入格式 Input Format
第一行有一个正整数n,代表学校的人数。
第二行有n个用空格隔开的数,这些数只能是0或1,其中,0代表一个女生,1代表一个男生。

对于30%的数据,n<=100;
对于50%的数据,n<=1 000;
对于100%的数据,n<=100 000。

输出格式 Output Format
输出一个非负整数。这个数表示在输入数据中最长的一段男女人数相等的子序列长度。
如果不存在男女人数相等的子序列,请输出0。

样例输入 Sample Input
9
0 1 0 0 0 1 1 0 0

样例输出 Sample Output
6

时间限制 Time Limitation
各个测试点1s

注释 Hint
样例说明:
选择第2个人至第7个人可以获得男女人数均为3的最长子序列。
请写出详细过程

这不是vijos上的t1007么?还好我参加了,这是我的100分答案
program liukevijosT1007_1;
var
a:array[0..100001] of integer;
b,c:array[0..100001] of longint;
n,m,i,j,t,p,q,x:longint;
f:boolean;
begin
readln(n);
p:=0;
q:=0;
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
for i:=1 to n do
begin
read(a[i]);
if a[i]=1 then
begin
inc(p);
b[i]:=b[i-1]+1;
end
else
begin
inc(q);
b[i]:=b[i-1]-1;
end;
end;
for i:=n downto 1 do
begin
if a[i]=1 then
c[i]:=c[i+1]+1
else
c[i]:=c[i+1]-1;
end;
m:=p-q;
if p>q then t:=2*q else t:=2*p;
j:=n-t;
f:=false;
while t>0 do
begin
for x:=j downto 0 do
if m-b[x]-c[n-j+x+1]=0 then f:=true;
if f then break;
t:=t-2;
j:=j+2;
end;
writeln(t);
end.