zoukankan      html  css  js  c++  java
  • 车展 (Standard IO)

    题意/Description:

           遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展。车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台。刚开始每个展台都有一个唯一的高度h[i]。主管已经列好一张单子:
           L1 R1
           L2 R2
           …
           Lm Rm
           单子上的(Li,Ri)表示第i次车展将要展出编号从Li到Ri的车。
           为了更加美观,展览时需要调整展台的高度,使参展所有展台的高度相等。展台的高度增加或减少1都需花费1秒时间。由于管理员只有一个人,所以只好对每个展台依次操作。每次展览结束后,展台高度自动恢复到初始高度。
           请告诉管理员为了举办所有展览,他最少需要花多少时间将展台调整好。

     

    读入/Input

           第一行为两个正整数n、m。
           第二行共n个非负整数,表示第i辆车展台的高度h[i]。
           接下来m行每行2个整数Li、Ri(Li≤Ri)。

     

    输出/Output

           一个正整数,调整展台总用时的最小值。

     

    题解/solution

           找出每个区间的中位数,用t,k表示每个区间比a[i]大或小的个数。如果区间有奇数个,则比中位数大或小的个数是相等的,即t,k是相等的;如果区间有偶数个,则比中位数大或小的个数相差为1,即abs(t-k)=1。

           用邻接表储存,注意要用int64!!!

           详情见程序。

     

    代码/Code

    var
      n,mm,mid:longint;
      ans:int64;
      a,f:array [0..1001] of longint;
      num:array [0..1001,0..1,0..1001] of longint;
      m,use:array [0..1001,0..1001] of longint;
    procedure init;
    var
      i,j,k,t1,t2,t,x,y:longint;
    begin
      readln(n,mm);
      for i:=1 to n do
        read(a[i]);
      for i:=1 to n do
        begin
          mid:=a[i];
          m[0,0]:=0;
          for j:=1 to n do
            begin
              if a[j]>mid then f[j]:=f[j-1]+1 else
                if a[j]<mid then f[j]:=f[j-1]-1 else
                  f[j]:=f[j-1];
              m[j,0]:=0;
              m[j,1]:=0;
            end;
          for j:=0 to i do
            begin
              t:=f[i]-f[j];
              if t>0 then begin t1:=t; t2:=1; end else
                if t<0 then begin t1:=-t; t2:=0; end else
                  begin t1:=0; t2:=0; end;
              inc(m[t1,t2]);
              num[t1,t2,m[t1,t2]]:=j+1;
            end;
          for j:=i to n do
            begin
              t:=f[j]-f[i];
              if t>0 then begin t1:=t; t2:=0; end else
                if t<0 then begin t1:=-t; t2:=1; end else
                  begin t1:=0; t2:=0; end;
              for k:=1 to m[t1,t2] do
                use[num[t1,t2,k],j]:=mid;
            end;
        end;
      for i:=1 to mm do
        begin
          readln(x,y);
          if (y-x) mod 2=1 then mid:=use[x,y-1]
                           else mid:=use[x,y];
          for j:=x to y do
            ans:=ans+abs(a[j]-mid);
        end;
      write(ans);
    end;
    
    begin
      init;
    end.



  • 相关阅读:
    C# 抽象方法和虚方法的区别
    xmlhttprequest readyState 属性的五种状态
    ServiceStack破解文件
    k8s部署mysql
    docker 开放2376端口的问题
    .net core 发布到IIS 没有 web.config 文件
    1064
    docker mysql 主从同步配置
    Docker 鼠标在虚拟机与主机之间自由切换
    Socket原理解析2
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319664.html
Copyright © 2011-2022 走看看