알고리즘

백준 히오스 프로게이머 (JAVA)

박카스마시며코딩 2023. 3. 15. 13:22

https://www.acmicpc.net/problem/16564

 

16564번: 히오스 프로게이머

첫째 줄에는 캐릭터의 개수 N, 올릴 수 있는 레벨 총합 K가 주어진다. (1 ≤ N ≤1,000,000, 1 ≤ K ≤ 1,000,000,000) 다음 N개의 줄에는 현재 각 캐릭터의 레벨이 X1, X2, X3, ... , Xn 으로 주어진다. (1 ≤ Xi ≤

www.acmicpc.net

 

 

 

 

package BOJ.binarysearch;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_16564 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = stoi.apply(st.nextToken());
        int k = stoi.apply(st.nextToken());
        int[] level = new int[n];
        for(int i = 0 ; i < n ; i++){
            level[i] = stoi.apply(br.readLine());
        }
        long result = cal(level,n,k);
        System.out.println(result);
    }

    private static long cal(int[] level, int n, int k) {
        long start = 0;
        long end = 2_000_000_000;
        long result = 0;
        while(start <= end){
            long mid = (start+end) / 2;
            if(check(level,n,mid,k)){
                start = mid + 1;
                result = mid;
            }else{
                end = mid - 1;
            }
        }
        return result;
    }

    private static boolean check(int[] level, int n, long mid, int k) {
        long cnt = 0;
        for(int i = 0 ; i < n ; i++){
            if(level[i] < mid){
                cnt += mid - level[i];
            }
        }
        if(cnt > k){
            return false;
        }
        return true;
    }
}