您的位置:首页 > 其它

8.9 排队的奶牛 2494

2017-08-09 19:33 218 查看
题目

题解

代码

题目

农夫约翰的N只奶牛排成了一条直线,每只奶牛都有一个特定的标识序号,从左到右第i只奶牛的编号是Bi。

约翰认为他的奶牛队列中存在某段连续区间都是相同序号的,那他的队列就非常的美观。为了创造这样的一个连续区间,约翰决定将某个特定的序号的奶牛全部剔除队列。

问题描述:

请帮助约翰计算出通过选择除去某个特定序号的全部奶牛后,所剩下的队列中连续的有相同序号的奶牛的最大区间。

数据范围:1<=N<=1000,奶牛序号的范围是0到1000000

题解

暴力枚举去掉每一种序号的情况,因为n只有1000

时间复杂度O(n2)

还有一种O(n)的做法。

记录a[i]和b[i]是从第一只奶牛到第i只奶牛中离第i只奶牛最近的两种序号,同时记录a[i]和b[i]两种奶牛的数量。比如序列733773777,那么当我们从左到右扫描到第7只奶牛的时候:a=3,b=7,a的数量是1,b的数量是2,当我们扫描第5只奶牛的时候,a=7,b=3,a的数量是1,b的数量是2。这样我们从左到右扫描就可以得到答案了。

代码

var
i,j,k,t,max,n,ans:longint;
a,b,c:array[0..1000000]of longint;
begin
assign(input,'cowrow.in');
assign(output,'cowrow.out');
reset(input);rewrite(output);
readln(n);
t:=1;a[0]:=
d0b8
-1;
for j:=1 to n do
begin
readln(k);
if a[t-1]<>k then
begin
a[t]:=k;
c[k]:=1;
inc(b[t]);
inc(t);
end else inc(b[t-1]);
end;
for i:=1 to t-1 do
if c[a[i]]=1 then
begin
for j:=1 to t-1 do
if (a[j]<>a[i]) then
begin
k:=j;
max:=b[k];
while (a[k+1]=a[i])and(a[k+2]=a[k]) do
begin
max:=max+b[k+2];
k:=k+2;
end;
if max>ans then ans:=max;
end;
end;
writeln(ans);
close(input);close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: