首页 > 代码库 > JZOJ 1724. eko(eko.pas/cpp)

JZOJ 1724. eko(eko.pas/cpp)

1724. 【10.6NOIP普及模拟】eko(eko.pas/cpp)
(File IO): input:eko.in output:eko.out

时间限制: 1000 ms  空间限制: 256000 KB  具体限制 
Goto ProblemSet

题目描述



         小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.

 

JZOJ 1724. eko(eko.pas/cpp)