코드포스

[Codeforces Round #790 (Div. 4)] E. Eating Queries

거북이같은곰 2022. 5. 18. 20:20

 

 


※ 섭취해야 하는 설탕의 양이(x)  모든 사탕의 합보다 크다면 -1을 출력

※ 설탕의 양이 사탕의 합과 같다면 사탕의 갯수(n) n을 출력

※ 사탕의 정보가 있는 배열을 정렬한 후 가장 설탕이 많은 사탕부터 사탕 갯수당 설탕의 양을 나타내는 배열을 만든다

 (1,1,3,3,4,4,5,9) -> (9, 9+5, 9+5+4, 9+5+4+4, ... 9+5+4+4+3+3+1+1)

※ n, q가 150,000 이므로 nq가 아닌 q*log n 인 이분탐색으로 찾아야함

 

1.사탕 갯수마다 설탕의 합을 나타내는 dp배열을 생성

2. x가 sum(설탕의 합)보다 크면 -1 같으면 n

3. 나머지 경우는 이분탐색으로 dp배열을 탐색

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;
 
public class Main {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int T = Integer.parseInt(br.readLine());
		while(T --> 0) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int N = Integer.parseInt(st.nextToken());
			int Q = Integer.parseInt(st.nextToken());
			st = new StringTokenizer(br.readLine(), " ");
			long[] arr = new long[N];
			long sum = 0;
			for(int i = 0; i < N; i++) {
				arr[i] = Integer.parseInt(st.nextToken());
				sum += arr[i];
			}
			Arrays.sort(arr);
			long[] dp = new long[N+1];
			
			int cnt = 1;
			for(int j = N-1; j >= 0; j--) {
				dp[cnt] = dp[cnt-1] + arr[j];
				cnt++;
			}
			//System.out.println(Arrays.toString(dp));
			for(int i = 0; i < Q; i++) {
				st = new StringTokenizer(br.readLine());
				long a = Integer.parseInt(st.nextToken());
				if(sum < a) {
					sb.append(-1).append('\n');
				}
				else if(sum == a) {
					sb.append(N).append('\n');
				}
				else {
					int temp = 0;
					int lo = 1;
					int hi = N+1;
					while(lo < hi) {
						int mid = (lo+hi) / 2;
						if(dp[mid] < a) {
							lo = mid+1;
						}
						else {
							hi = mid;
						}
					}
					sb.append(lo).append('\n');
				}
			}
		}
		System.out.println(sb);
    }
}