import
java.util.ArrayList;
import
java.util.Collections;
import
java.util.List;
public
class
Main {
static
int
m, n;
static
boolean
isValid(
int
val,
int
K,
List<List<Integer> > mat)
{
int
operationRequire =
0
;
for
(
int
i =
0
; i < m; i++) {
for
(
int
j =
0
; j < n; j++) {
if
(mat.get(i).get(j) > val)
operationRequire
+= mat.get(i).get(j) - val;
if
(operationRequire > K)
return
false
;
}
}
return
true
;
}
static
int
minimizeMax(
int
K, List<List<Integer> > mat)
{
int
start =
0
, end =
0
, minn = Integer.MAX_VALUE;
for
(List<Integer> i : mat) {
end = Math.max(end, Collections.max(i));
minn = Math.min(minn, Collections.min(i));
}
int
result = end;
while
(start <= end) {
int
mid = (start + end) /
2
;
if
(isValid(mid, K, mat)) {
result = mid;
end = mid -
1
;
}
else
{
start = mid +
1
;
}
}
return
Math.max(result - minn,
0
);
}
public
static
void
main(String[] args)
{
List<List<Integer> > mat =
new
ArrayList<>();
mat.add(List.of(
1
,
4
,
7
));
mat.add(List.of(
3
,
2
,
6
));
mat.add(List.of(
11
,
4
,
12
));
m = mat.size();
n = mat.get(
0
).size();
int
K =
3
;
int
maxValue = minimizeMax(K, mat);
System.out.println(
"The minimized maximum value is: "
+ maxValue);
}
}