과제 무게를 오름차순 정렬해서 투 포인터로 품.
1) 두 포인터가 가리키는 값의 합이 제한된 무게보다 큰 경우
뒤의 포인트를 내림
2) 뒤의 포인터를 내리고 작은 경우
앞의 포인터를 올림
현재 최대가 되는 두 무게의 합과 현재 포인터가 가리키는 합을 비교하여 더 큰 값으로 answer 갱신
answer을 갱신해가며 두 개의 포인터가 만날때 종료
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class D9299 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
int N,M,start,end,cur,answer,arr[];
for(int t = 1; t <= T; t++){
st = new StringTokenizer(br.readLine());
N=Integer.parseInt(st.nextToken());
M=Integer.parseInt(st.nextToken());
start=0;
end=N-1;
answer=-1;
arr=new int[N];
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
arr[i]=Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
while(start!=end) {
int add =arr[start]+arr[end];
if(add>M)
end--;
else {
cur=arr[start]+arr[end];
answer=answer>cur?answer:cur;
start++;
}
}
bw.write("#"+t+" "+answer+"\n");
bw.flush();
}
}
}