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,代表每棵树的高度。
第二行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
对于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.