Description
Solution
第一眼看到题目就以为是贪心,每一列都是相对独立的,对于每一列都单独操作,最后再一起算答案。但是发现并不可以,因为可能一个数对于当前列而言是累赘,但是对于其他数来说却是助力,是可以选择的,这样的策略是错的。分析平均数的性质:,我们可以二分答案,运用以上公式进行计算,若结果为负数则结果不合法,大于等于0则计入答案。(然而我被卡精度了)
Code
var
a:array[0..100005] of int64;
n,h,i,j:longint;
x:int64;
sum,num,ans,l,r,mid,s1,s2:extended;
function pd(x:extended):boolean;
var i,j:longint;
begin
sum:=0;
for i:=1 to n do
begin
s1:=a[i*h-h+1]-x;s2:=0;
for j:=1 to h do
begin
s2:=s2+(a[i*h-h+j]-x);
if s1<s2 then s1:=s2;
end;
sum:=sum+s1;
end;
if sum>=1e-6 then exit(true);exit(false);
end;
begin
readln(n,h);
for i:=1 to n do
begin
for j:=1 to h do
begin
read(a[i*h-h+j]);
r:=r+a[i*h-h+j];
end;
readln;
end;
while l<r-(1e-6) do
begin
mid:=(l+r)/2;
if pd(mid) then
begin
ans:=mid;
l:=mid+(1e-6);
end
else r:=mid-(1e-6);
end;
if pd(l) then ans:=l;
writeln(ans:0:4);
end.