[標準/Java]251予算



条件


  • 場所の数はN個です.(3 <= N <= 10,000)

  • 各地方の予算要求はN個ある.(1<=予算<=10000)

  • 総予算を出す.(最大10億円)
  • 入力例



    解説


    この問題は二分探索によって解決でき,予算を要求する値に最大の値を加える範囲である.各地方で要求される予算値は総予算より低いため、範囲の最大値は予算値の中で最大になります.次に、予算全体を探索し、中間値vs要求予算に低い値を加えてsum値が予算全体を超えたかどうかを決定する.

    コード#コード#

    import java.io.*;
    import java.util.*;
    
    
    
    public class Main {
    	
    	static int N,M;
    	static int[] A;
    	
    	
    	static FastReader scan = new FastReader();
    	static StringBuilder sb = new StringBuilder();
    
    	static void input() {
    		
    	N = scan.nextInt(); // 지방의 수를 받는다.
    	A = new int[N + 1]; // index를 1부터 시작하기 위해 +1을 해준다.
    	for(int i=1;i<=N;i++) {
    		A[i] = scan.nextInt(); // 지방이 요청하는 예산을 받는다.
    	} 
    	M = scan.nextInt(); //총 예산을 받는다.
    	}
    
    	
    	static boolean findAns(int buget) {
    		int sum = 0;
    		for(int i=1;i<=N;i++) {
    			 sum += Math.min(A[i],buget); // 요청 예산과 mid을 비교하여 더 낮은 값을 								//넣어주고 sum을 해 총 예산보다 작다면 true를 반환한다.
    		}
    		return sum <= M;
    
    	}
    	
    
    	static void find() {
    	int ans =0, L =0, R = 0; 
    	for(int i =1;i<=N;i++) {
    		R = Math.max(R, A[i]); // 탐색 범위의 최대값은 요청 예산에서 제일 큰값으로 해주							   // 다
    	}
    	while(L <= R) {
    		int mid = (L + R) / 2;
    		if(findAns(mid)) {
    			ans = mid; //true이면 ans에 mid값을 넣고
    			L = mid + 1; // 범위를 줄여준다.
    		} else {
    			R = mid - 1;
    		}
    	}
    	System.out.println(ans);
    		}
    
    		
    		
    	public static void main(String[] args) {
    		input();
    		find();
    	}
    	
    	static class FastReader{
    		BufferedReader br;
    		StringTokenizer st;
    		
    		public FastReader() {
    			br = new BufferedReader(new InputStreamReader(System.in));
    		}
    		
    		public FastReader(String s) throws FileNotFoundException {
    			br = new BufferedReader(new FileReader(new File(s)));
    		}
    		
    		String next() {
    			while(st == null || !st.hasMoreElements()) {
    				try {
    					st = new StringTokenizer(br.readLine());
    				} catch(IOException e) {
    					e.printStackTrace();
    				}
    			}
    			return st.nextToken();
    		}
    		
    		int nextInt() {
    			return Integer.parseInt(next());
    		}
    		Long nextLong() {
    			return Long.parseLong(next());
    		}
    		double nextDouble(){
    			return Double.parseDouble(next());
    		}
    		String nextLine() {
    			String str = "";
    			try {
    				str = br.readLine();
    			}catch(IOException e) {
    				e.printStackTrace();
    			}
    			return str;
    		}
    	}
    }