
높이가 0일때 ~ 256일때의 경우의 수를 모두 계산하면 된다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int [] height = new int[257]; //높이에 따른 개수 (ex. 높이 0: 11개, 1: 1개)
for(int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j=0; j<m; j++) {
int a = Integer.parseInt(st.nextToken());
height[a]++;
}
}
int time = 256*2*500*500;
int max_height = 0;
for(int i=0; i<257; i++) { //높이가 0일때, 1일때, 2일때, ..., 256일 때
int tmp = 0;
int block = b;
for(int j=0; j<257; j++) {
if(height[j] > 0) { //높이가 존재하는 경우에만
if(j > i) {
tmp += ((j-i)*height[j]*2);
block += ((j-i)*height[j]);
}
else if(j < i) {
tmp += ((i-j)*height[j]);
block -= ((i-j)*height[j]);
}
}
}
if(block >= 0 && time > tmp) {
time = tmp;
max_height = i;
}
else if(block >= 0 && time == tmp) {
max_height = Math.max(max_height, i);
}
}
System.out.println(time + " " + max_height);
}
}
2023-03-23