8.9 排队的奶牛 2494

来源:互联网 发布:js new date 初始化 编辑:程序博客网 时间:2024/06/04 01:00

  • 题目
  • 题解
  • 代码

题目

农夫约翰的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]:=-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.
原创粉丝点击