zoukankan      html  css  js  c++  java
  • JZOJ 1724. eko(eko.pas/cpp)

    题目描述



             小x最近终于不用干搬砖的活了,他成为了一名光荣的伐木工人。但伐木工人也不好当,他每天必须至少砍下M米的木材。但小x对此感到毫无压力,因为小y最近给他买了一台崭新的伐木机,可以像野火一样将森林摧毁。但这台伐木机实在太大了,它一次只能将一整排树木一起砍倒。

             伐木机是这样工作的:小x设计一个参数H,然后伐木机将一排N个树木砍倒,然后得到每棵树高于H的部分。比如,有4棵树,高度分别为20,15,10,17米,而小x将H设为了15米。这样,他从第一棵得到了5m的木材,第四棵得到了2m的木材,一共是7m。当然,如果一棵树的高度不大于H,那么就不会被砍倒,也就不会留下木材。小x是个环保主义者,他希望H尽可能大,这样他砍倒的树木可以尽可能少。当然,前提是小x能至少得到M米木材。

    输入

    第一行两个整数N,M,代表有N棵树,小x每天至少砍M米木材。

    第二行N个整数Ai,代表每棵树的高度。

    输出

    一行一个整数,代表所要求的最大高度。

    样例输入

    4 7

    20 15 10 17

    样例输出

    15

    数据范围限制

    对于30%的数据:1 ≤ N ≤1 000

    对于100%的数据:

    1 ≤ N ≤1 000 000

    1 ≤ M ≤ 2 000 000 000

    1 ≤ Ai ≤ 1 000 000 000

    PS: 题目应该是没有不可能的情况,可以忽略

    FIRST

    .      假设有一个高度b就是我们要的答案,那么可以得出我们这么一个公式:

           总高度和-保留的树木>=最少要得到的木材  就是

    解不等式得到:   【表示学LaTeX的语法好艰难。。。】

          那我们是不是只要根据这个不等式解出b就可以了?

      ?

    Second

       Of course not !

       因为会出现这种情况:

    Third

       最终解法:

       1.  把a数组qsort一遍,并按照不等式求出b

       2.从最小a[1]的开始比较,如果b高于a[i] 那么把他们的差的绝对值分给其他的树

         接着比较,直到a[i]<=b就停止循环,此时得到的b是一个实数,对其取整,输出

      PS:   pascal 的浮点数比较坑,  调试了半个小时,才发现要减去一个0.9999999....qwq

     1 {
     2     by @bobble !
     3                     2017-1-19
     4 }
     5 program eko;
     6 const
     7   inf='eko.in';
     8   outf='eko.out';
     9 var
    10   m:int64;
    11    sum,ans:qword;
    12    aa,s2:Extended;
    13    i,n:longint;
    14    a:array[0..1000000] of int64;
    15 
    16 procedure qsort(l,r:longint);
    17 var
    18    i,j,x,y:int64;
    19 begin
    20    i:=l;  j:=r;  x:=a[(l+r) div 2];
    21    repeat
    22      while a[i]<x do inc(i);
    23      while x<a[j] do dec(j);
    24      if not(i>j) then
    25      begin
    26         y:=a[i];   a[i]:=a[j];   a[j]:=y;
    27         inc(i);    j:=j-1;
    28      end;
    29   until i>j;
    30   if l<j then qsort(l,j);
    31   if i<r then qsort(i,r);
    32 end;
    33 
    34 begin
    35   assign(input,inf);
    36   assign(output,outf);
    37   reset(input); rewrite(output);
    38 
    39   readln(n,m);
    40 
    41   for i:= 1 to n do
    42   begin
    43     read(a[i]);
    44     sum:=sum+a[i];
    45   end;
    46   qsort(1,n);
    47 
    48   aa:=(sum-m)/n;
    49 
    50   i:=1;
    51   while aa>a[i] do
    52   begin
    53     s2:=(aa-a[i]);
    54     aa:=aa+s2/(n-i);
    55     inc(i);
    56     if i>n then break;
    57   end;
    58   if trunc(aa-0.9999999)+1>a[i] then ans:=trunc(aa)
    59     else ans:=trunc(aa-0.9999999)+1;
    60   writeln(ans);
    61 
    62   close(input);
    63   close(output);
    64 end.
  • 相关阅读:
    【AtCoder】ARC067 F
    【AtCoder】ARC095 E
    【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
    【CodeForces】961 F. k-substrings 字符串哈希+二分
    【CodeForces】961 G. Partitions 斯特林数
    【BZOJ】2310: ParkII 插头DP
    【BZOJ】2331: [SCOI2011]地板 插头DP
    webpack从0开始---(二)
    webpack从0开始---(一)
    前端基础知识(不应需要思考的知识点)三
  • 原文地址:https://www.cnblogs.com/bobble/p/6308695.html
Copyright © 2011-2022 走看看