3079 - 입국심사(java)

Byung Seon Kang·2022년 11월 26일
0

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

/**
 * @Author: kbs
 */
public class Main {

    static long N, M;
    private static final long MAX_TIME = (long) 1e9;
    static ArrayList<Long> timeToCheck = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Long.parseLong(st.nextToken());
        M = Long.parseLong(st.nextToken());

        for (int i = 0; i < N; i++) {
            timeToCheck.add(Long.parseLong(br.readLine()));
        }


        long result = binarySearch(1L, MAX_TIME * M);

        System.out.println(result);
    }

    private static long binarySearch(long startTime, long endTime) {
        long mid = (startTime + endTime) / 2;

        if (startTime >= endTime) return endTime;

        long count = 0;
        for (long timePerPerson : timeToCheck) {
            if (count > MAX_TIME * M) break;
            count += mid / timePerPerson;
        }

        if (count < M) {
            return binarySearch(mid + 1, endTime);
        } else {
            return binarySearch(startTime, mid);
        }
    }
}
  • 오버플로우잡는것 때문에 오래걸렸다.
  • count를 더할 때 timePerPerson이 다 1인경우 long 타입도 범위를 벗어날 수 있으므로 최대로 나올 수 있는 시간을 초과하는 경우 break 시켜야한다.
profile
왜 필요한지 질문하기

0개의 댓글