zoukankan      html  css  js  c++  java
  • 3464. 【NOIP2013模拟联考6】秀姿势(sugata) (Standard IO)

    Description

    “蓝猫淘气三千问,看蓝猫,我有姿势我自豪!”话说能考上HYSBZ的孩纸们肯定都是很有姿势的孩纸们,但是大家普遍偏科,都只有一门科目考得好。已知HYSBZ的入学考试科目数量小于等于10^9,而有n个学生参加了入学考试。现在HYSBZ要刷人了,招生办每一次刷人会把一个科目考得好的人全部刷掉,但是最多不能刷超过K次。(刷就是不录取)而HYSBZ的校长看录取名单时,最喜欢看的就是连续都是同一个科目考得好的人。他定义完美学生序列为连续且考得好的科目都为同一门的学生序列。现在招生办主任想让你帮他设计一种录取方案,使得最长的完美学生连续子序列尽量长。
     

    Input

    共N+1行,第一行2个正整数n,K,n表示入学考试人数,K表示刷人次数上限。
    接下来N行,每行仅一个正整数Ai,为i号学生所考得好的科目。
     

    Output

    仅1个正整数,为最长的最长完美学生连续子序列。
     
    Solutions

    用队列维护一个区间,使得这个区间的擅长科目数量不超过 K+1, 那么统计出来的每个合法区间的众数的数量的最大值便为答案。具体操作 如下:

    (1).首先添加第一个元素入队列,此时 Head=Tail=1

    (2).接下来不断添加元素入队,当队列内元素种类不大于 K+1 时统计答案。

    (3).当队列里的元素种类大于 K+1 时,不断将队列头部的元素出队,直到 队列内元素种类小于等于 K+1,这时要记得也要统计答案。 这便是这道题的算法。

    时间复杂度 O(n)

    代码

     1 const
     2   maxn=1000000;
     3 var
     4   n,k,ans:longint;
     5   f,a:array[0..100001]of longint;
     6   ha:array[0..1000000,1..2]of longint;
     7 function max(o,p:longint):longint;
     8 begin
     9   if o>p then exit(o);
    10   exit(p);
    11 end;
    12 
    13 function hash(x:longint):longint;
    14 var
    15   i:longint;
    16 begin
    17   i:=x mod maxn;
    18   while (ha[i,1]<>0) and (ha[i,1]<>x) do
    19     i:=(i+1) mod maxn;
    20   exit(i);
    21 end;
    22 
    23 procedure init;
    24 var
    25   i:longint;
    26 begin
    27   read(n,k);
    28   for i:=1 to n do
    29     read(a[i]);
    30 end;
    31 
    32 procedure main;
    33 var
    34   i,j,head,tail,num:longint;
    35 begin
    36   head:=1; tail:=0;
    37   ans:=1; num:=0;
    38   for i:=1 to n do
    39     begin
    40       inc(tail);
    41       j:=hash(a[i]);
    42       if ha[j,1]=0 then
    43         begin
    44           inc(num);
    45           ha[j,1]:=a[i];
    46           ha[j,2]:=1
    47         end else
    48         begin
    49           inc(ha[j,2]);
    50           ans:=max(ans,ha[j,2]);
    51           end;
    52       f[tail]:=a[i];
    53       while num>k+1 do
    54         begin
    55           j:=hash(f[head]);
    56           dec(ha[j,2]);
    57           if ha[j,2]=0 then
    58             begin
    59               ha[j,1]:=0;
    60               dec(num);
    61             end;
    62           inc(head);
    63         end;
    64     end;
    65 end;
    66 
    67 begin
    68   init;
    69   main;
    70   writeln(ans);
    71 end.
  • 相关阅读:
    springMvc 4.0 jackson包改变
    spring 获取bean的几种方式
    添加@ControllerAdvice后报错 Failed to invoke @ExceptionHandler method
    Cglib学习报错 java.lang.reflect.InvocationTargetException-->null
    JDK动态proxy原理解析
    (转)jquery $.proxy的使用
    (转)jQuery的deferred对象详解
    (转)JavaScript中==和===的区别
    (扫盲)jQuery extend()和jQuery.fn.extend()的区别
    (转)js中__proto__和prototype的区别和关系
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9337854.html
Copyright © 2011-2022 走看看