#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
ll n;
ll server[1001][1001];
ll Max = -1;//이분탐색 경계값
ll total;
void INPUT()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> server[i][j],
Max = max(Max,server[i][j]),
total += server[i][j];
}
void SOLVE()
{
ll left = 0,right = Max;
ll ans;
while(left <= right)
{
//mid분만큼 지났을 때
ll mid = (left + right) / 2;
//각 지점 컴퓨터의 높이가 mid보다 낮다면 server[i][j]만큼 , mid이상 이라면 mid만큼 작동한다.
ll cnt = 0;//작동하는 컴퓨터의 수
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cnt += min(server[i][j],mid);
//작동하는 컴퓨터의 수가 절반 이상이라면, mid를 줄여본다.
if(2*cnt >= total) ans = mid , right = mid - 1;
//절반 미만으로 작동한다면, mid를 키운다.
else left = mid + 1;
}
cout << ans;
}
int main()
{
INPUT();
SOLVE();
}
GOLD5 미만 난이도는 알고리즘 및 풀이 설명을 주석으로 대체합니다.
주석을 참고해주세요.